> For AI agents: the complete documentation index is available at https://www.tteam.icu/llms.txt, the full documentation bundle is available at https://www.tteam.icu/llms-full.txt.

# prometheus-exporter

由于 Prometheus 的 Exporter 种类繁多，因此单独开了个文档。

## PostgreSQL 监控

[postgres\_exporter](https://github.com/prometheus-community/postgres_exporter)

### 单个数据库

```sh file="./prometheus/exporter/postgres_exporter.sh" title="postgres_exporter.sh"
#!/bin/bash

start_pg_exporter() {
pg_host=$1
pg_port=$2
pg_user=$3
pg_password=$4
exporter_port=$5
docker kill postgresql-exporter-${exporter_port}
docker rm postgresql-exporter-${exporter_port}
docker run -d \
--restart=always \
-p ${exporter_port}:9187 \
--name postgresql-exporter-${exporter_port} \
-v /etc/localtime:/etc/localtime:ro \
-v /etc/timezone:/etc/timezone:ro \
-e DATA_SOURCE_NAME="postgresql://${pg_user}:${pg_password}@${pg_host}:${pg_port}/postgres?sslmode=disable" \
wrouesnel/postgres_exporter
}

pgid="hdy-nmg-server-001"
pg_host="10.0.18.2"
pg_port="5432"
pg_user="postgres"
pg_password=""
exporter_port=13101
start_pg_exporter ${pg_host} ${pg_port} ${pg_user} ${pg_password} ${exporter_port}
```

```yaml title="Prometheus配置增加"
  # hdy-nmg-server-001
  - job_name: 'hdy-nmg-server-001'
    static_configs:
      - targets: ['127.0.0.1:13101']
        labels:
          type: postgresql
          instance: hdy-nmg-server-001
```

### 多个数据库

```sh file="./prometheus/exporter/postgres_exporter_setup.sh" title="postgres_exporter_setup.sh"
#!/bin/bash

mkdir -p config/
cat << EOF > config/postgres_exporter.yml
auth_modules:
  hdy-nmg-server-001:
    type: userpass
    userpass:
      username: postgres
      password: NoKgWU
    options:
      sslmode: disable
  aliyun-hz-server-master:
    type: userpass
    userpass:
      username: postgres
      password: 9VczV
    options:
      sslmode: disable
EOF

docker kill postgresql-exporter
docker rm postgresql-exporter
docker run -d --net=host \
--name postgresql-exporter \
-v /etc/timezone:/etc/timezone:ro \
-v /etc/localtime:/etc/localtime:ro \
--restart=always \
-v $(pwd)/config/:/etc/postgres-exporter/ \
quay.io/prometheuscommunity/postgres-exporter \
--config.file /etc/postgres-exporter/postgres_exporter.yml \
--web.listen-address=:13101
```

```yaml title="Prometheus配置增加"
  - job_name: 'postgresql-exporter'
    scrape_interval: 15s
    scrape_timeout: 10s
    file_sd_configs:
      - files: ['/usr/local/prometheus/groups/postgresql/*.json','/usr/local/prometheus/groups/postgresql/*.yml']
    metrics_path: /probe
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [instance]
        target_label: __param_auth_module
      - target_label: __address__
        replacement: "10.0.18.2:13101"
```

```yaml file="./prometheus/exporter/groups/postgresql/postgresql.yml" title="prometheus/groups/postgresql/postgresql.yml"
- targets: [ "10.0.18.2:5432"]
  labels:
    job_name: hdy-nmg-server-001
    instance: hdy-nmg-server-001
    saltid: hdy-nmg-server-001
    comment: "hdy-nmg-server-001"

- targets: [ "47.xxx.xxx.xxx:5432"]
  labels:
    job_name: aliyun-hz-server-master
    instance: aliyun-hz-server-master
    saltid: aliyun-hz-server-master
    comment: "aliyun-hz-server-master"
```

`grafana` 的监控模板为 `9628`。

## MySQL 监控

[mysql\_exporter](https://github.com/prometheus/mysqld_exporter)

### 单个数据库

```sh file="./prometheus/exporter/mysql_exporter.sh" title="mysql_exporter.sh"
#!/bin/bash

# hdy-nmg-server-001

port=10309

docker kill mysqld-exporte-${port}
docker rm mysqld-exporte-${port}

cat << EOF > .my.cnf
[client]
user=root
password=
EOF

docker run -d --name mysqld-exporte-${port} \
--net host \
--restart=always \
-v /etc/timezone:/etc/timezone:ro \
-v /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime:ro \
-v $(pwd)/.my.cnf:/config/.my.cnf \
prom/mysqld-exporter \
--web.listen-address=:${port} \
--config.my-cnf="/config/.my.cnf"
```

```yaml title="Prometheus配置增加"
  # hdy-nmg-server-001
  - job_name: 'mysql'
    static_configs:
      - targets: ['127.0.0.1:10309']
        labels:
          type: mysql
          instance: hdy-nmg-server-001
```

### 多个数据库

```sh file="./prometheus/exporter/mysql_exporter_setup.sh" title="mysql_exporter_setup.sh"
#!/bin/bash

# hdy-nmg-server-001

port=10309

docker kill mysqld-exporte-${port}
docker rm mysqld-exporte-${port}

cat << EOF > .my.cnf
[hdy-nmg-server-001]
user=root
password=
[aliyun-hz-server-master]
user=root
password=
EOF

docker run -d --name mysqld-exporte-${port} \
--net host \
--restart=always \
-v /etc/timezone:/etc/timezone:ro \
-v /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime:ro \
-v $(pwd)/.my.cnf:/config/.my.cnf \
prom/mysqld-exporter \
--web.listen-address=:${port} \
--config.my-cnf="/config/.my.cnf"
```

```yaml title="Prometheus配置增加"
  - job_name: 'mysql-exporter'
    scrape_interval: 15s
    scrape_timeout: 10s
    file_sd_configs:
      - files: ['/usr/local/prometheus/groups/mysql/*.json','/usr/local/prometheus/groups/mysql/*.yml']
    metrics_path: /probe
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [instance]
        target_label: __param_auth_module
      - target_label: __address__
        replacement: "10.0.18.2:10309"
```

```yaml file="./prometheus/exporter/groups/mysql/mysql.yml" title="prometheus/groups/mysql/mysql.yml"
- targets: [ "10.0.18.2:3306"]
  labels:
    job_name: hdy-nmg-server-001
    instance: hdy-nmg-server-001
    saltid: hdy-nmg-server-001
    comment: "hdy-nmg-server-001"

- targets: [ "47.xxx.xxx.xxx:3306"]
  labels:
    job_name: aliyun-hz-server-master
    instance: aliyun-hz-server-master
    saltid: aliyun-hz-server-master
    comment: "aliyun-hz-server-master"
```

`grafana` 的监控模板为 `7362`。

## Kafka 监控

[kafka\_exporter](https://github.com/danielqsj/kafka_exporter)

### 单个数据库

```sh file="./prometheus/exporter/kafka_exporter.sh" title="kafka_exporter.sh"
#!/bin/bash

port=9308

docker rm -f kafka_exporter

docker run -id \
--restart=always \
--network=host \
--name=kafka_exporter \
danielqsj/kafka-exporter \
--kafka.server=1.0.0.1:9092 \
--kafka.server=1.0.0.2:9092 \
--kafka.server=1.0.0.3:9092
```

```yaml title="Prometheus配置增加"
  - job_name: 'kafka_exporter'
    scrape_interval: 30s
    scrape_timeout: 10s
    static_configs:
      - targets: ['10.32.8.4:9308']
```

`grafana` 的监控模板为 `7589`。

## 接口监控

[blackbox\_exporter](https://github.com/prometheus/blackbox_exporter)

```sh file="./prometheus/exporter/blackbox_exporter.sh" title="blackbox_exporter.sh"
#!/bin/bash

docker stop blackbox_exporter
docker rm blackbox_exporter
docker run -d \
  --restart=always \
  -p 9115:9115 \
  --name blackbox_exporter \
  -v $(pwd)/config:/config \
  -v /etc/timezone:/etc/timezone:ro \
  -v /etc/localtime:/etc/localtime:ro \
  quay.io/prometheus/blackbox-exporter:latest --config.file=/config/blackbox.yml
```

```yaml file="./prometheus/exporter/config/blackbox.yml" title="config/blackbox.yml"
modules:
  # 通用get
  http_2xx:
    prober: http
    timeout: 35s
    http:
      valid_http_versions: ["HTTP/1.1", "HTTP/2.0"]
      valid_status_codes: []  # Defaults to 2xx
      method: GET
      preferred_ip_protocol: "ip4" # defaults to "ip6"
      ip_protocol_fallback: false  # no fallback to "ip6"
  # 无参post
  http_post_2xx:
    prober: http
    timeout: 35s
    http:
      method: POST
      headers:
        Content-Type: application/json
```

```yaml title="Prometheus配置增加"
  - job_name: 'blackbox-exporter'
    scrape_interval: 60s
    scrape_timeout: 35s
    file_sd_configs:
      - files: ['/usr/local/prometheus/groups/blackbox/*.json','/usr/local/prometheus/groups/blackbox/*.yml']
    metrics_path: /probe
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [module]
        target_label: __param_module
      - source_labels: [address]
        target_label: address
      - target_label: __address__
        replacement: "127.0.0.1:9115"
```

```yaml file="./prometheus/exporter/groups/blackbox/blackbox.yml" title="prometheus/groups/blackbox/blackbox.yml"
- targets: [ "http://10.0.18.2:8008/api/video_type/list" ]
  labels:
    module: "http_2xx"
    address: "http://10.0.18.2:8008/api/video_type/list"
    instance: "wx-video"
```

## Redis 监控

redis\_exporter

```sh file="./prometheus/exporter/redis_exporter.sh" title="redis_exporter.sh"
#!/bin/bash

port=9121

docker rm -f redis-exporter
docker run -d --name redis-exporter \
--restart=always \
-v $(pwd)/config/redis_exporter.json:/data/redis_exporter.json \
-e REDIS_PASSWORD_FILE=/data/redis_exporter.json \
-p ${port}:9121 \
oliver006/redis_exporter:v1.90.0

```

```json file="./prometheus/exporter/config/redis_exporter.json" title="config/redis_exporter.json"
{
  "redis://192.168.1.1:6379": "password",
  "redis://192.168.1.1:6380": ""
}

```

```yaml file="./prometheus/exporter/groups/redis/redis.yml" title="prometheus/groups/redis/redis.yml"
- targets:
    - 'redis://192.168.1.1:6379'
  labels:
    saltid: test
    redisid: redis1
    instance: redis1
    comment: 测试1

- targets:
    - 'redis://192.168.1.1:6380'
  labels:
    saltid: test
    redisid: redis2
    instance: redis2
    comment: 测试2

```

```yaml title="Prometheus配置增加"
  - job_name: 'redis-exporter'
    scrape_interval: 15s
    scrape_timeout: 10s
    file_sd_configs:
      - files: ['/usr/local/prometheus/groups/redis/redis.json','/usr/local/prometheus/groups/redis/redis.yml']
    metrics_path: /scrape
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - target_label: __address__
        replacement: "192.168.1.1:9121"
```

`grafana` 的监控模板为 `11835`。

## [HAProxy 监控](https://www.tteam.icu/ops/middleware/haproxy.md#prometheus%E7%9B%91%E6%8E%A7%E6%94%B6%E9%9B%86)

```yaml file="./prometheus/exporter/groups/haproxy/haproxy.yml" title="prometheus/groups/haproxy/haproxy.yml"
- targets: [ "192.168.1.1:8405"]
  labels:
    job_name: ha-test-1
    instance: ha-test-1
    saltid: test
    comment: 测试

```

```yaml title="Prometheus配置增加"
  - job_name: 'haproxy-exporter'
    scrape_interval: 15s
    scrape_timeout: 10s
    file_sd_configs:
      - files: ['/usr/local/prometheus/groups/haproxy/haproxy.json','/usr/local/prometheus/groups/haproxy/haproxy.yml']
```

`grafana` 的监控模板为 `12693`。

## PVE 监控

[pve\_exporter](https://github.com/prometheus-pve/prometheus-pve-exporter)

```sh file="./prometheus/exporter/pve_exporter.sh" title="pve_exporter.sh"
#!/bin/bash

port=9221

docker kill pve-exporter
docker rm pve-exporter

docker run -d \
--name pve-exporter \
--restart=always \
--network=host \
-v $(pwd)/groups/pve/pve.yml:/etc/prometheus/pve.yml \
buyfakett/pve_exporter

```

```yaml file="./prometheus/exporter/config/pve_exporter.yml" title="config/pve_exporter.yml"
default:
  user: root@pam
  password: password
  # Optional: set to false to skip SSL/TLS verification
  verify_ssl: false
```

```yaml title="Prometheus配置增加"
  - job_name: 'pve_exporter'
    scrape_interval: 15s
    scrape_timeout: 10s
    file_sd_configs:
      - files: ['/usr/local/prometheus/groups/pve/pve.json','/usr/local/prometheus/groups/pve/pve.yml']
    relabel_configs:
      - source_labels: [target]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
```

```yaml file="./prometheus/exporter/groups/pve/pve.yml" title="prometheus/groups/pve/pve.yml"
- targets: [ "172.168.1.1:9221"]
  labels:
    module: default
    cluster: dc-cn-sy-pve-003
    node: dc-cn-sy-pve-003
    target: '172.168.1.1'
```

## Nginx 监控

使用 `buyfakett/openresty:1.31.1.1-vts_0.2.7-ngx_waf_10.1.2` 镜像。

```yaml title="Prometheus配置增加"
  - job_name: 'nginx-host-exporter'
    scrape_interval: 15s
    scrape_timeout: 10s
    metrics_path: '/status/format/prometheus'
    file_sd_configs:
      - files: ['/usr/local/prometheus/groups/nginx/*.json','/usr/local/prometheus/groups/nginx/*.yml']
```

```yaml file="./prometheus/exporter/groups/nginx/nginx.yml" title="prometheus/groups/nginx/nginx.yml"
- targets: [ "192.168.1.1:9145"]
  labels:
    job_name: nginx
    instance: nginx
    app: nginx
    comment: "test"
```

`grafana` 的监控模板为 `9785`。

## Linux 监控

[node\_exporter](https://github.com/prometheus/node_exporter)

```yaml title="Prometheus配置增加"
  - job_name: 'node-exporter'
    scrape_interval: 15s
    scrape_timeout: 10s
    file_sd_configs:
      - files: ['/usr/local/prometheus/groups/node_exporter/*.json','/usr/local/prometheus/groups/node_exporter/*.yml']
```

```yaml file="./prometheus/exporter/groups/node_exporter/nodes.yml" title="prometheus/groups/node_exporter/nodes.yml"
- targets: [ "192.168.1.1:9100"]
  labels:
    job_name: server-001
    instance: server-001
    comment: "node-001"
```

`grafana` 的监控模板为 `1860`。

## Windows 监控

windows\_exporter

[Exporter 安装方法](https://www.tteam.icu/ops/windows/%E6%B3%A8%E5%86%8C%E6%9C%8D%E5%8A%A1.md)

```yaml title="Prometheus配置增加"
  - job_name: 'windows-exporter'
    scrape_interval: 30s
    scrape_timeout: 10s
    file_sd_configs:
      - files: ['/usr/local/prometheus/groups/windows_exporter/*.json','/usr/local/prometheus/groups/windows_exporter/*.yml']
```

```yaml file="./prometheus/exporter/groups/windows_exporter/windows.yml" title="prometheus/groups/windows_exporter/windows.yml"
- targets: [ "127.0.0.1:9182"]
  labels:
    job_name: test-server-001
    instance: test-server-001
    saltid: test-server-001
```

`grafana` 的监控模板为 `20763`。

## Hetzner StorageBox 监控

[hetzner\_storagebox\_exporter](https://github.com/crstian19/prometheus-storagebox-exporter)

```sh file="./prometheus/exporter/hetzner_storagebox_exporter.sh" title="hetzner_storagebox_exporter.sh"
#!/bin/bash
name=storagebox-exporter

docker rm -f ${name}
docker run -d \
  --name ${name} \
  --network=host \
  -e HETZNER_TOKEN="your-api-token" \
  ghcr.io/crstian19/prometheus-storagebox-exporter:latest
```

```yaml title="Prometheus配置增加"
  - job_name: 'storagebox-exporter'
    scrape_interval: 5m
    scrape_timeout: 30s
    static_configs:
      - targets: ['localhost:9509']
```

`grafana` 的监控模板为 `24537`。

## 数据库监控

[sql\_exporter](https://github.com/burningalchemist/sql_exporter)

可以监控数据库是否有新数据。

```sh file="./prometheus/exporter/sql_exporter.sh" title="sql_exporter.sh"
#!/bin/bash

# https://github.com/burningalchemist/sql_exporter

port=9399

docker rm -f sql_exporter

mkdir -p config/

docker run -d --net host \
--name sql_exporter \
--restart=always \
-v /etc/localtime:/etc/localtime:ro \
-v /etc/tiemzone:/etc/timezone:ro \
-v ./config/:/etc/sql_exporter/ \
registry.cn-hangzhou.aliyuncs.com/buyfakett/sql_exporter \
-config.file /etc/sql_exporter/sql_exporter.yml \
-web.listen-address ":${port}"
```

```yaml file="./prometheus/exporter/config/sql_exporter.yml" title="config/sql_exporter.yml"
# Global settings and defaults.
global:
  scrape_timeout_offset: 500ms
  min_interval: 0s
  max_connections: 3
  max_idle_connections: 3
  max_connection_lifetime: 10m

# The target to monitor and the list of collectors to execute on it.
target:
  name: "prices_db"
  data_source_name: 'postgres://postgres:password@192.168.1.1:5432/gps?sslmode=disable'
  collectors: [moto_data]

# Collector definition files.
collector_files:
  - "collectors/*.collector.yml"

```

```yaml file="./prometheus/exporter/config/collectors/moto_data.collector.yml" title="config/collectors/moto_data.collector.yml"
collector_name: moto_data

metrics:
  - metric_name: moto_data
    type: counter
    help: '5分钟内，有没有新数据'
    static_labels:
      database_id: esxi-pg-001
    values: [counter]
    query: |
      SELECT CASE
           WHEN EXISTS (
                  SELECT 1
                  FROM trip_information_29
                  WHERE createtime >= NOW() - INTERVAL '5 minutes'
              ) THEN 1
           ELSE 0
       END AS counter;

```

```yaml title="Prometheus配置增加"
  - job_name: 'sql_exporter'
    scrape_interval: 15s
    scrape_timeout: 10s
    metrics_path: /metrics
    static_configs:
      - targets: ['192.168.1.1:9399']
```

检测表是否 5 分钟没有新增数据(查询结果用 1 或 0 显示):


**postgres**

```sql
SELECT CASE
WHEN EXISTS (
SELECT 1
FROM trip_information_29
WHERE createtime >= NOW() - INTERVAL '5 minutes'
) THEN 1
ELSE 0
END AS counter;
```


**mysql**

```sql
SELECT CASE
WHEN EXISTS (
SELECT 1
FROM trip_information_29
WHERE createtime >= NOW() - INTERVAL 5 MINUTE
) THEN 1
ELSE 0
END AS counter;
```


**clickhouse**

```sql
SELECT
if(count(*) > 0, 1, 0) AS counter
FROM
log.ngxlog
WHERE
create_time >= now() - INTERVAL 5 MINUTE
```

