如何将在Docker容器中运行的Grafana连接到在主机上运行的Prometheus数据源(在Mac上为Docker)?

我已经在localhost:57475/metrics上启动了Prometheus服务器:

如何将在Docker容器中运行的Grafana连接到在主机上运行的Prometheus数据源(在Mac上为Docker)?

使用以下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
}

我还使用以下命令(遵循https://grafana.com/docs/installation/docker/)在容器中启动了Grafana:

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

在Grafana中,我想连接到在Mac localhost上运行的Prometheus导出器。在https://docs.docker.com/docker-for-mac/networking/之后,我尝试使用特殊的DNS名称host.docker.internal,因此将URL指定为http://host.docker.internal:57475/metrics。但是,当我单击“保存并测试”时,结果为HTTP Error Not Found

如何将在Docker容器中运行的Grafana连接到在主机上运行的Prometheus数据源(在Mac上为Docker)?

知道为什么这不起作用吗?

更新

我没有使用特殊的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:8080server: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

但是,如果我尝试在Grafana管理员中添加相同的URL,则会出现相同的错误:

如何将在Docker容器中运行的Grafana连接到在主机上运行的Prometheus数据源(在Mac上为Docker)?

换句话说,尽管我可以从Grafana容器中curl来使用此端点,但是我不能将其用作Grafana仪表板中的数据源URL,这使我认为这是Grafana所特有的。知道为什么这行不通吗?

houzhd 回答:如何将在Docker容器中运行的Grafana连接到在主机上运行的Prometheus数据源(在Mac上为Docker)?

--network host添加到您的docker run命令中:

docker run --network host...

然后在Grafana设置中使用localhost:[prometheus_port]

相关docs

,

事实证明,我对Prometheus的工作方式不太了解。该示例中的Go应用程序创建了Prometheus exporter ,仍然必须由Prometheus server 对其进行抓取,而该服务器又是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:

enter image description here

本文链接:https://www.f2er.com/3164309.html

大家都在问