В первой части мы научились отправлять данные из Go приложения в формате OpenTelemetry, теперь необходимо их сохранять для визуализации и анализа. Для этого есть множество готовых инструментов, рассмотрим LGTM Stack.

LGTM — это популярный стек для мониторинга и наблюдаемости, включающий в себя Loki, Grafana, Tempo и Mimir. Этот набор инструментов обеспечивает полный цикл сбора и визуализации метрик, логов и трассировок.

Что такое LGTM Stack?

Loki — система для агрегирования и анализа логов.

Grafana — платформа для визуализации метрик, логов и трассировок.

Tempo — система для распределенного трейсинга.

Mimir — система для долговременного хранения метрик.

Сразу можно посмотреть на готовый docker-compose.yaml и конфигурацию каждого из компонентов.

Помечу, это готовый пример для использования на этапе разработки, не для production.

Как это работает?

Приложение отправляет данные OpenTelemetry (логи, метрики и трассировки) в OpenTelemetry collector на единый адрес. Коллектор раскладывает эти данные по разным системам.

Пример конфигурации коллектора:

receivers:
  otlp:
    protocols:
      grpc:
        endpoint: 0.0.0.0:4317
      http:
        endpoint: 0.0.0.0:4318
exporters:
  otlp:
    endpoint: tempo:4317
    tls:
      insecure: true
  prometheusremotewrite:
    endpoint: http://mimir:9009/api/v1/push
    tls:
      insecure: true
  otlphttp:
    endpoint: http://loki:3100/otlp
service:
  pipelines:
    traces:
      receivers: [otlp]
      exporters: [otlp]
    metrics:
      receivers: [otlp]
      exporters: [ prometheusremotewrite ]
    logs:
      receivers: [ otlp ]
      exporters: [ otlphttp ]

Как правило, коллектор устанавливается рядом с приложением на сервере, если серверов несколько то на каждом сервере.

Коллектор полезен тем, что это единый endpoint на который можно отправлять все данные, плюс он умеет их сжимать/модифицировать и эффективно передавать дальше.

Запуск

Наиболее удобный способ запуска docker compose, ниже кратки пример файла. Полной готовый файл тут.

version: '3.7'

services:
  app:
    image: golang:1.21
    ports:
      - "8180:8180"
      - "8280:8280/tcp"
    environment:
      - "OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4318"
    volumes:
      - ./:/app/
    working_dir: /app
    command: go run main.go

  tempo:
    image: grafana/tempo:latest
    command: [ "-config.file=/etc/tempo.yaml" ]
    volumes:
      - ./deployments/tempo/tempo.yaml:/etc/tempo.yaml

  otel-collector:
    image: otel/opentelemetry-collector-contrib
    volumes:
      - ./deployments/otelcol/config.yaml:/etc/otelcol-contrib/config.yaml

  mimir:
    image: grafana/mimir:latest
    volumes:
      - ./deployments/mimir/mimir.yaml:/etc/mimir/mimir.yaml
    command: "--config.file=/etc/mimir/mimir.yaml"

  grafana:
    image: grafana/grafana:latest
    ports:
      - "3000:3000"

  loki:
    image: grafana/loki:3.1.0
    volumes:
      - ./deployments/loki/config.yaml:/mnt/config/loki.yml
    command: --config.file=/mnt/config/loki.yml

Сервис app - это пример приложения который отправляет данные в формате OpenTelemetry.

Стартуем:

docker compose up -d

Настройки визуализации

После установки всех компонентов, вы можете использовать Grafana для визуализации ваших метрик, логов и трассировок. Добавьте соответствующие источники данных в Grafana и создайте дашборды для мониторинга ваших сервисов.