Я запустил сервер 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
. 1017 *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"]
Если я присоединяюсь к графуiner и curl 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приборная панель, заставляя меня думать, что это что-то графическое специфическое. Есть идеи, почему это не работает?