出现错误“Get http://localhost:9443/metrics: dial tcp 127.0.0.1:9443: connect: connection refused”

37

我正在尝试配置Prometheus和Grafana与我的Hyperledger Fabric v1.4网络,以分析同行和链代码的度量。按照此文档,我将对等方容器的端口9443映射到主机的端口9443。在对等端的core.yml文件的metrics部分下,我还将provider条目更改为prometheus。我已经按以下方式在docker-compose.yml中配置了Prometheus和Grafana。

  prometheus:
    image: prom/prometheus:v2.6.1
    container_name: prometheus
    volumes:
    - ./prometheus/:/etc/prometheus/
    - prometheus_data:/prometheus
    command:
    - '--config.file=/etc/prometheus/prometheus.yml'
    - '--storage.tsdb.path=/prometheus'
    - '--web.console.libraries=/etc/prometheus/console_libraries'
    - '--web.console.templates=/etc/prometheus/consoles'
    - '--storage.tsdb.retention=200h'
    - '--web.enable-lifecycle'
    restart: unless-stopped
    ports:
    - 9090:9090
    networks:
    - basic
    labels:
    org.label-schema.group: "monitoring"

  grafana:
    image: grafana/grafana:5.4.3
    container_name: grafana
    volumes:
    - grafana_data:/var/lib/grafana
    - ./grafana/datasources:/etc/grafana/datasources
    - ./grafana/dashboards:/etc/grafana/dashboards
    - ./grafana/setup.sh:/setup.sh
    entrypoint: /setup.sh
    environment:
    - GF_SECURITY_ADMIN_USER={ADMIN_USER}
    - GF_SECURITY_ADMIN_PASSWORD={ADMIN_PASS}
    - GF_USERS_ALLOW_SIGN_UP=false
    restart: unless-stopped
    ports:
    - 3000:3000
    networks:
    - basic
    labels:
    org.label-schema.group: "monitoring"

当我在远程CentOS机器上运行curl 0.0.0.0:9443/metrics时,我可以获得所有指标列表。但是,当我使用上述配置运行Prometheus时,它会抛出错误Get http://localhost:9443/metrics: dial tcp 127.0.0.1:9443: connect: connection refused。以下是我的prometheus.yml文件。

global:
  scrape_interval:     15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: 'prometheus'
    scrape_interval: 10s
    static_configs:
      - targets: ['localhost:9090']

  - job_name: 'peer_metrics'
    scrape_interval: 10s
    static_configs:
      - targets: ['localhost:9443']
即使我在浏览器中访问端点http://localhost:9443/metrics,也可以获取所有指标。我做错了什么?为什么Prometheus指标显示在其界面上,而不是对等方的界面上?
8个回答

62

由于目标不在prometheus容器内运行,因此无法通过localhost访问它们。您需要通过主机私有IP或将localhost替换为docker.for.mac.localhosthost.docker.internal来访问它们。

在Windows上:

  • host.docker.internal已测试win10、win11

在Mac上:

  • docker.for.mac.localhost

7
应该仅使用 host.docker.internaldocker.for.mac.localhostdocker.for.win.localhost 已被弃用。 - Datz
哇,这真的在我搜索了几个小时后帮了我大忙。非常感谢你。 - Funyinoluwa Kashimawo

20

问题: 在Prometheus上,您添加了一个用于抓取的服务,但在 http://localhost:9090/targets 上,端点状态为Down, 并显示以下错误:

Get http://localhost:9091/metrics: dial tcp 127.0.0.1:9091: connect: connection refused

enter image description here

解决方案: 您需要验证prometheus.yml文件是否满足以下条件:

  1. 抓取详情指向正确的终端。
  2. yml缩进是正确的。
  3. 使用 curl -v http://<serviceip>:<port>/metrics 命令会在终端中以纯文本形式显示度量标准。

注意: 如果您指向另一个Docker容器中的服务,则您的本地主机名可能不是 localhost,而是代表所示的服务名称(在docker ps中)或 docker.host.internal(运行Docker容器的内部IP)。

本示例: 我将使用2个Docker容器 prometheus 和 "myService" 进行演示。

sudo docker ps

CONTAINER ID        IMAGE                     CREATED                        PORTS                    NAMES
abc123        prom/prometheus:latest        2 hours ago               0.0.0.0:9090->9090/tcp         prometheus
def456        myService/myService:latest         2 hours ago               0.0.0.0:9091->9091/tcp         myService

然后编辑prometheus.yml文件(并重新运行prometheus)

- job_name: myService
  scrape_interval: 15s
  scrape_timeout: 10s
  metrics_path: /metrics
  static_configs:
    - targets: // Presenting you 3 options
      - localhost:9091 // simple localhost 
      - docker.host.internal:9091 // the localhost of agent that runs the docker container
      - myService:9091 // docker container name (worked in my case)
      
        

1
在Linux上,myService:9090可能是首选的方式。 - user_dev
谢谢。Docker容器名称适合我。 - Promise Preston
host.docker.internal容器名称对我有用。 - Pavel

10

您的Prometheus容器并未运行在主机网络上,而是运行在其自己的桥接网络上(由docker-compose创建)。因此,对于peer的抓取配置应该指向peer容器的IP地址。

推荐解决方法:

  • 将Prometheus和Grafana运行在与Fabric网络相同的网络中。 在Prometheus堆栈的docker-compose中,您可以像这样引用它:
networks:
  default:
    external:
      name: <your-hyperledger-network>

使用docker network ls命令查找网络名称。

然后您可以在抓取配置中使用http://<peer_container_name>:9443


我已经在docker-compose.yml文件中添加了prometheus和grafana的配置。我在顶部添加了networks: basic: driver: bridge。Prometheus正常工作,当在prometheus界面上查看时,目标是正常的。但是,当我在grafana中添加数据源http://localhost:9443时,它显示HTTP Bad error Gateway。 - Kartik Chauhan
在docker-compose.yml中添加网络后,我遇到了错误:“Network basic declared as external, but could not be found. Please create the network manually using docker network create basic and try again.” - Kartik Chauhan
通过执行docker network inspect <network-name>来检查网络,我可以看到Prometheus和Grafana容器与其他Fabric容器在同一个网络中。 - Kartik Chauhan
1
@KartikChauhan 在 Grafana 中,你应该只添加 Prometheus 作为数据源 - 即 prometheus:9090。 - antweiss
@antweiss 是的,我正在按照你在这里说的做。 我已经在prometheus.yml中添加了以下内容:
  • job_name: 'peer_metrics' scrape_interval: 10s static_configs: - targets: ['peer0.org1.example.com:9443']
我在prometheus界面上看到了目标,但是当我在grafana中使用url http:localhost:9090创建数据源时,我没有看到任何与peer或chaincode相关的图形。
- Kartik Chauhan
显示剩余6条评论

3

注意
此解决方案不适用于docker swarm,仅适用于独立容器(多容器),旨在运行在overlay网络上。

当使用overlay网络时,我们会遇到相同的错误,这里提供的解决方案是(静态而非动态):

此配置无效:

global:
  scrape_interval:     15s
  evaluation_interval: 15s

  external_labels:
    monitor: 'promswarm'

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

  - job_name: 'node'
    static_configs:
      - targets: [ 'localhost:9100' ]

即使 http://docker.for.mac.localhost:9100/ 可用,这个问题仍然存在,也就是说 prometheus 找不到 node-exporter。因此下面的方法也无法解决该问题:
global:
  scrape_interval:     15s
  evaluation_interval: 15s

  external_labels:
    monitor: 'promswarm'

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']


  - job_name: 'node'
    static_configs:
      - targets: [ 'docker.for.mac.localhost:9100'  ]

但是仅仅使用其容器ID,我们就可以通过其端口号访问该服务。

docker ps
CONTAINER ID   IMAGE                    COMMAND                  CREATED          STATUS          PORTS                                       NAMES
a58264faa1a4   prom/prometheus          "/bin/prometheus --c…"   5 minutes ago    Up 5 minutes    0.0.0.0:9090->9090/tcp, :::9090->9090/tcp   unruffled_solomon
62310f56f64a   grafana/grafana:latest   "/run.sh"                42 minutes ago   Up 42 minutes   0.0.0.0:3000->3000/tcp, :::3000->3000/tcp   wonderful_goldberg
7f1da9796af3   prom/node-exporter       "/bin/node_exporter …"   48 minutes ago   Up 48 minutes   0.0.0.0:9100->9100/tcp, :::9100->9100/tcp   intelligent_panini

因此,我们有7f1da9796af3 prom/node-exporter标识符,可以更新我们的yml文件为:

global:
  scrape_interval:     15s
  evaluation_interval: 15s

  external_labels:
    monitor: 'promswarm'

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']


  - job_name: 'node'
    static_configs:
      - targets: [ '7f1da9796af3:9100'  ]

不工作

enter image description here

工作中

enter image description here


更新

我自己对这个硬编码的解决方案并不满意,所以在进行其他搜索后,找到了一种更可靠的方法,使用 --network-alias NAME覆盖网络中,该容器将通过该名称进行路由。因此,yml看起来像这样:

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']


  - job_name: 'node'
    static_configs:
      - targets: [ 'node_exporter:9100' ]

其中,名称node_exporter是使用run子命令创建的别名。例如:

docker run --rm  -d  -v "/:/host:ro,rslave" --network cloud --network-alias node_exporter --pid host -p 9100:9100   prom/node-exporter  --path.rootfs=/host

在简短说明中,它表明在叠加的网络中,您可以使用node_exporter:<PORT>访问node-exporter。

0

如果你指向另一个 Docker 容器中的某个服务,你的本地主机可能不是以 localhost 的形式表示,而是以服务名称(在 docker ps 中显示的服务名称)或运行 Docker 容器的内部 IP 表示。

prometheus.yaml

 - job_name: "node-exporter"

    static_configs:
      - targets: ["nodeexporter:9100"] // docker container name

0

我意识到我之所以出现这个错误,是因为AKS中的kubeprostack pods(如prometheus)也在运行。当我将与kubeprostack相关的pods在AKS的“deployments”和“deamonsets”部分缩减至1时,问题得到解决,我成功连接到了Grafana Prometheus。因为prometheus和kubeprostack都在尝试工作,只有prometheus pods保留时问题才得以解决。

后续状态图像


0

将这两个容器运行在同一个 Docker 网络中,问题就会得到解决。

success log


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接