Как подключить Grafana, работающую в контейнере Docker, к источнику данных Prometheus, работающему на хост-компьютере (в Docker для Mac)?

Я запустил сервер Prometheus в localhost:57475/metrics:

введите описание изображения здесь

используя следующий код Go:

package main

import (
    "net/http"

    "contrib.go.opencensus.io/exporter/prometheus"
    log "github.com/sirupsen/logrus"
    "go.opencensus.io/plugin/ochttp"
    "go.opencensus.io/stats/view"
)

func main() {
    stop := make(chan struct{})

    server := &http.Server{Addr: ":8080"}

    statsMux := http.NewServeMux()
    statsServer := &http.Server{Handler: statsMux, Addr: ":57475"}

    if err := view.Register(ochttp.DefaultServerViews...); err != nil {
        log.WithError(err).Fatal("register HTTP metrics view")
    }

    exporter, err := prometheus.NewExporter(prometheus.Options{
        Namespace: "default",
    })
    if err != nil {
        log.WithError(err).Fatal("create Prometheus exporter")
    }

    view.RegisterExporter(exporter)

    statsMux.Handle("/metrics", exporter)

    originalHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("Hello, World!"))
    })
    och := &ochttp.Handler{
        Handler: originalHandler,
    }

    server.Handler = och

    go func() {
        log.Info("Starting stats server...")
        if err := statsServer.ListenAndServe(); err != nil {
            log.WithError(err).Fatal("listen and serve stats")
        }
    }()

    go func() {
        log.Info("Starting server...")
        if err := server.ListenAndServe(); err != nil {
            log.WithError(err).Fatal("listen and serve service endpoints")
        }
    }()

    <-stop
}

Я также запустил Grafana в контейнере с помощью следующей команды (после https://grafana.com/docs/installation/docker/):

> docker run --detach --publish 3000:3000  --env "GF_SECURITY_ADMIN_PASSWORD=secret" grafana/grafana
2a17ad2bcc05e2955190129b981b3329cd2c5e89098e28b443337ac79ed607f2

В Grafana я хотел бы подключиться к экспортеру Prometheus, работающему на моем Mac localhost. После https://docs.docker.com/docker-for-mac/networking/, я пытался использовать специальное DNS-имя host.docker.internal, поэтому указав URL-адрес как http://host.docker.internal:57475/metrics. Однако это приводит к HTTP Error Not Found, когда я нажимаю «Сохранить и протестировать»:

введите описание изображения здесь

Любая идея, почему это не работает?

Обновлять

Вместо использования специального DNS-имени host.docker.internal я попытался объединить сервер и Grafana в многоконтейнерное приложение Docker Compose и использовать мост Docker для их соединения, но это тоже не сработало. Со следующей структурой каталогов:

.
├── docker-compose.yml
└── server
    ├── Dockerfile
    ├── go.mod
    ├── go.sum
    └── main.go

и следующее docker-compose.yml:

version: '3'
services:
  server:
    build: ./server
    ports:
      - "8080:8080"
      - "57475:57475"
  grafana:
    image: grafana/grafana
    ports:
      - "3000:3000"

и следующее Dockerfile:

FROM golang:1.12

WORKDIR /go/src/app
COPY . .

RUN go get -d -v ./...
RUN go install -v ./...

CMD ["app"]

Если я присоединяюсь к контейнеру Grafana и скручиваю server:8080 или server:57475/metrics, я получаю ответ:

useprometheus> docker exec -it --user root useprometheus_grafana_1 /bin/ash
/usr/share/grafana # apk add curl
fetch http://dl-cdn.alpinelinux.org/alpine/v3.10/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.10/community/x86_64/APKINDEX.tar.gz
(1/3) Installing nghttp2-libs (1.39.2-r0)
(2/3) Installing libcurl (7.66.0-r0)
(3/3) Installing curl (7.66.0-r0)
Executing busybox-1.30.1-r2.trigger
OK: 17 MiB in 24 packages
/usr/share/grafana # curl server:8080
Hello, World!/usr/share/grafana # curl server:57475/metrics
# HELP default_opencensus_io_http_server_latency Latency distribution of HTTP requests
# TYPE default_opencensus_io_http_server_latency histogram
default_opencensus_io_http_server_latency_bucket{le="1"} 1
default_opencensus_io_http_server_latency_bucket{le="2"} 1
default_opencensus_io_http_server_latency_bucket{le="3"} 1
default_opencensus_io_http_server_latency_bucket{le="4"} 1

Однако, если я попытаюсь добавить тот же URL-адрес в админку Grafana, я получу ту же ошибку:

введите описание изображения здесь

Другими словами, хотя я могу curl получить эту конечную точку из контейнера Grafana, я не могу использовать ее в качестве URL-адреса источника данных на панели инструментов Grafana, что заставляет меня думать, что это что-то специфичное для Grafana. Любая идея, почему это не работает?


person Kurt Peek    schedule 04.11.2019    source источник
comment
используйте IP-адрес вашего хоста для подключения или используйте --network host в контейнере запуска докеров и используйте localhost для подключения   -  person LinPy    schedule 04.11.2019


Ответы (2)


Оказывается, я не совсем понял, как работает Prometheus. Приложение Go в этом примере создает экспортер Prometheus, который по-прежнему должен очищаться сервером Prometheus, который, в свою очередь, является источником данных для Grafana.

Я изменил структуру каталогов, чтобы она выглядела так:

.
├── docker-compose.yml
├── prometheus
│   ├── Dockerfile
│   └── prometheus.yml
└── server
    ├── Dockerfile
    ├── go.mod
    ├── go.sum
    └── main.go

где docker-compose.yml

version: '3'
services:
  server:
    build: ./server
    ports:
      - "8080:8080"
      - "57475:57475"
  grafana:
    image: grafana/grafana
    ports:
      - "3000:3000"
  prometheus:
    build: ./prometheus
    ports:
      - "9090:9090"

и prometheus/Dockerfile есть

FROM prom/prometheus

ADD prometheus.yml /etc/prometheus

и prometheus/prometheus.yml это

global:
  scrape_interval:     15s

scrape_configs:
  - job_name: 'server'

    static_configs:
      - targets: ['server:57475']

Теперь я могу добавить prometheus:9090 в качестве URL-адреса источника данных:

введите здесь описание изображения

person Kurt Peek    schedule 04.11.2019

Добавьте --network host к вашей команде docker run:

docker run --network host...

Затем используйте localhost:[prometheus_port] в настройках Grafana.

Соответствующие документы

person rok    schedule 04.11.2019
comment
Если я попробую это и попытаюсь curl http://localhost:3000/, я получу Failed to connect to localhost port 3000: Connection refused (то есть я вообще не смогу увидеть панель инструментов Grafana) - person Kurt Peek; 04.11.2019
comment
контейнер Grafana запустился? это, вероятно, вниз. - person rok; 04.11.2019
comment
Служба запущена, я вижу grafana_1 | t=2019-11-04T20:48:07+0000 lvl=info msg="HTTP Server Listen" logger=http.server address=0.0.0.0:3000 protocol=http subUrl= socket= в логах от docker-compose up (во втором примере, где я указываю network: "host" в docker-compose.yml). - person Kurt Peek; 04.11.2019