Skip to content

InfluxDB 内部监控

InfluxDB 1.x 内部监控

监控端点

  • /metrics 端点

    • 功能:暴露InfluxDB内部监控指标
    • 默认地址http://localhost:8086/metrics
    • 支持的格式:Prometheus格式
    • 开启方法:默认开启,无需额外配置
  • /debug/pprof 端点

    • 功能:提供Go语言pprof性能分析数据
    • 默认地址http://localhost:8086/debug/pprof
    • 开启方法:默认开启,无需额外配置

监控配置

  • 配置文件修改

    toml
    # /etc/influxdb/influxdb.conf
    [monitor]
      # 开启监控
      store-enabled = true
      # 监控数据保留时长
      store-database = "_internal"
      store-interval = "10s"
      
    [http]
      # 开启HTTP日志
      log-enabled = true
      # 开启慢查询日志
      log-queries-after = "1000000000"
  • 重启InfluxDB服务

    bash
    systemctl restart influxdb

内部数据库

  • _internal 数据库

    • 功能:存储InfluxDB自身的监控数据
    • 默认保留策略:7天
    • 包含的测量集
      • runtime:运行时指标
      • httpd:HTTP服务指标
      • queryExecutor:查询执行器指标
      • write:写入指标
      • cache:缓存指标
      • tsm1:TSM存储引擎指标
  • 查询内部监控数据

    sql
    -- 查看HTTP请求统计
    SELECT count(*) FROM "_internal"."monitor"."httpd" WHERE time > now() - 1h GROUP BY time(5m), "code"
    
    -- 查看写入性能
    SELECT mean("write_points_ok") FROM "_internal"."monitor"."write" WHERE time > now() - 1h GROUP BY time(5m)
    
    -- 查看缓存命中率
    SELECT mean("hits") / mean("misses") as "cache_hit_ratio" FROM "_internal"."monitor"."cache" WHERE time > now() - 1h GROUP BY time(5m)

InfluxDB 2.x 内部监控

监控端点

  • /metrics 端点

    • 功能:暴露InfluxDB内部监控指标
    • 默认地址http://localhost:8086/metrics
    • 支持的格式:Prometheus格式
    • 开启方法:默认开启,无需额外配置
  • /health 端点

    • 功能:提供InfluxDB健康检查
    • 默认地址http://localhost:8086/health
    • 返回格式:JSON
    • 开启方法:默认开启,无需额外配置
  • /debug/pprof 端点

    • 功能:提供Go语言pprof性能分析数据
    • 默认地址http://localhost:8086/debug/pprof
    • 开启方法:默认开启,无需额外配置

监控配置

  • 配置文件修改

    toml
    # /etc/influxdb/influxd.conf
    [monitor]
      # 开启监控
      enabled = true
      # 监控数据保留时长
      retention = "7d"
      
    [http]
      # 开启HTTP日志
      log-enabled = true
      # 开启慢查询日志
      log-queries-after = "1000000000"
  • 使用环境变量配置

    bash
    # 启动时设置环境变量
    INFLUXD_MONITOR_ENABLED=true INFLUXD_MONITOR_RETENTION=7d influxd

内部监控数据

  • 监控数据存储

    • 存储在内部桶 _monitoring_tasks
    • 默认保留策略:7天
    • 包含的测量集:
      • influxdb:InfluxDB核心指标
      • system:系统资源指标
      • runtime:运行时指标
      • task:任务执行指标
  • 查询内部监控数据

    sql
    -- 使用InfluxQL查询
    SELECT mean("writeBytes"), mean("readBytes") FROM "_monitoring"."autogen"."influxdb" WHERE time > now() - 1h GROUP BY time(5m)
    
    -- 使用Flux查询
    from(bucket: "_monitoring")
      |> range(start: -1h)
      |> filter(fn: (r) => r["_measurement"] == "influxdb")
      |> filter(fn: (r) => r["_field"] == "writeBytes" or r["_field"] == "readBytes")
      |> aggregateWindow(every: 5m, fn: mean, createEmpty: false)
      |> yield(name: "mean")

核心监控指标

运行时指标

指标名称描述单位1.x 测量集2.x 测量集
alloc已分配的内存bytesruntimeruntime
goroutines当前goroutine数量runtimeruntime
uptime服务运行时间secondsruntimeruntime
heap_inuse堆内存使用量bytesruntimeruntime
gc_pause_total_nsGC暂停总时间nanosecondsruntimeruntime
gc_pausesGC暂停次数runtimeruntime

HTTP服务指标

指标名称描述单位1.x 测量集2.x 测量集
reqHTTP请求总数httpdinfluxdb
write_req写入请求数httpdinfluxdb
query_req查询请求数httpdinfluxdb
ping_reqPing请求数httpdinfluxdb
status_2xx2xx状态码请求数httpdinfluxdb
status_4xx4xx状态码请求数httpdinfluxdb
status_5xx5xx状态码请求数httpdinfluxdb
query_duration_ms查询执行时间millisecondshttpdinfluxdb
write_duration_ms写入执行时间millisecondshttpdinfluxdb

写入指标

指标名称描述单位1.x 测量集2.x 测量集
write_points_ok成功写入的点数writeinfluxdb
write_points_err写入失败的点数writeinfluxdb
write_req写入请求数writeinfluxdb
write_req_bytes写入请求大小byteswriteinfluxdb
write_req_err写入请求失败数writeinfluxdb

查询指标

指标名称描述单位1.x 测量集2.x 测量集
queries_ok成功执行的查询数queryExecutorinfluxdb
queries_err执行失败的查询数queryExecutorinfluxdb
query_duration_ms查询执行时间millisecondsqueryExecutorinfluxdb
query_result_bytes查询结果大小bytesqueryExecutorinfluxdb
query_row_limit查询结果行数限制queryExecutorinfluxdb

存储指标

指标名称描述单位1.x 测量集2.x 测量集
tsm_filesTSM文件数量tsm1influxdb
tsm_file_size_bytesTSM文件总大小bytestsm1influxdb
wal_filesWAL文件数量walinfluxdb
wal_file_size_bytesWAL文件总大小byteswalinfluxdb
cache_size缓存大小bytescacheinfluxdb
cache_hit_ratio缓存命中率百分比cacheinfluxdb
series_count序列数量databaseinfluxdb

监控工具集成

Telegraf 集成

  • 配置 Telegraf 收集内部监控数据

    toml
    # /etc/telegraf/telegraf.conf
    [[inputs.influxdb]]
      urls = ["http://localhost:8086"]
      timeout = "5s"
      username = "admin"
      password = "admin_password"
      ssl = false
      ssl_verify = true
      insecure_skip_verify = false
    
    [[inputs.prometheus]]
      urls = ["http://localhost:8086/metrics"]
      interval = "10s"
    
    [[outputs.influxdb]]
      urls = ["http://localhost:8086"]
      database = "monitoring"
      retention_policy = ""
      write_consistency = "any"
      timeout = "5s"
  • 重启 Telegraf 服务

    bash
    systemctl restart telegraf

Prometheus 集成

  • 配置 Prometheus 抓取指标

    yaml
    # prometheus.yml
    global:
      scrape_interval: 15s
    
    scrape_configs:
      - job_name: 'influxdb'
        static_configs:
          - targets: ['localhost:8086']
        metrics_path: '/metrics'
  • 重启 Prometheus 服务

    bash
    systemctl restart prometheus

Grafana 仪表盘

  • 导入官方仪表盘

    • InfluxDB 1.x 官方仪表盘 ID:2583
    • InfluxDB 2.x 官方仪表盘 ID:13042
  • 配置数据源

    1. 登录 Grafana
    2. 点击左侧菜单中的"Configuration" → "Data Sources"
    3. 点击"Add data source"
    4. 选择"InfluxDB"
    5. 配置 InfluxDB 连接信息
    6. 点击"Save & Test"

健康检查

1.x 版本健康检查

  • 基本健康检查

    bash
    # 使用curl测试
    curl -I http://localhost:8086/ping
    
    # 预期返回
    HTTP/1.1 204 No Content
    Content-Type: application/json
    Request-Id: <request-id>
    X-Influxdb-Build: OSS
    X-Influxdb-Version: 1.8.10
    X-Request-Id: <request-id>
    Date: <date>
  • 深度健康检查

    bash
    # 检查内部数据库
    influx -execute "SHOW DATABASES"
    
    # 检查内部监控数据
    influx -execute "SELECT * FROM _internal.monitor.httpd LIMIT 10"
    
    # 检查进程状态
    systemctl status influxdb

2.x 版本健康检查

  • 基本健康检查

    bash
    # 使用curl测试
    curl -s http://localhost:8086/health | jq
    
    # 预期返回
    {
      "status": "pass",
      "checks": [
        {
          "name": "influxdb",
          "status": "pass"
        }
      ],
      "version": "2.7.1",
      "message": "ready for queries and writes"
    }
  • 深度健康检查

    bash
    # 使用influx CLI检查
    influx ping
    
    # 检查内部桶
    influx bucket list
    
    # 检查内部监控数据
    influx query -q "from(bucket: \"_monitoring\") |> range(start: -1h) |> limit(n: 10)"
    
    # 检查进程状态
    systemctl status influxdb

监控告警

1.x 版本告警

  • 创建连续查询监控

    sql
    -- 监控HTTP 5xx错误
    CREATE CONTINUOUS QUERY cq_http_errors ON _internal BEGIN
      SELECT count("code") INTO _internal.monitor.http_errors FROM httpd WHERE code = '500' GROUP BY time(5m)
    END
    
    -- 监控写入失败
    CREATE CONTINUOUS QUERY cq_write_errors ON _internal BEGIN
      SELECT sum("write_points_err") INTO _internal.monitor.write_errors FROM write GROUP BY time(5m)
    END
  • 创建告警脚本

    bash
    #!/bin/bash
    
    # 检查InfluxDB写入错误
    ERROR_COUNT=$(influx -execute "SELECT sum(write_points_err) FROM _internal.monitor.write WHERE time > now() - 5m" -format csv | tail -n 1 | cut -d ',' -f 2)
    
    if [ "$ERROR_COUNT" -gt 10 ]; then
      echo "InfluxDB写入错误过多:$ERROR_COUNT" | mail -s "InfluxDB告警" admin@example.com
    fi

2.x 版本告警

  • 创建告警任务

    bash
    # 创建写入错误告警任务
    influx task create -org my-org -name write_errors_alert -every 5m -query "
      from(bucket: \"_monitoring\")
        |> range(start: -5m)
        |> filter(fn: (r) => r["_measurement"] == \"influxdb\")
        |> filter(fn: (r) => r["_field"] == \"writePointsErr\")
        |> sum()
        |> map(fn: (r) => ({
          r with
          _measurement: \"alert\",
          _field: \"value\",
          alert: if r._value > 10 then \"write_errors_high\" else \"ok\" 
        }))
        |> to(bucket: \"monitoring\", org: \"my-org\")
    "
  • 配置告警通知

    bash
    # 创建Slack通知端点
    influx notification-endpoint create -org my-org -name slack -type slack -config '{
      "url": "https://hooks.slack.com/services/XXXXXXXXX/YYYYYYYYY/ZZZZZZZZZZZZZZZZZZZZZZZZ",
      "channel": "#alerts",
      "username": "InfluxDB"
    }'
    
    # 创建告警规则
    influx notification-rule create -org my-org -name write-errors -endpoint slack -every 5m -query "
      from(bucket: \"monitoring\")
        |> range(start: -5m)
        |> filter(fn: (r) => r["_measurement"] == \"alert\")
        |> filter(fn: (r) => r["_field"] == \"value\")
        |> filter(fn: (r) => r["alert"] == \"write_errors_high\")
    "

监控最佳实践

1. 监控关键指标

  • 必须监控的指标

    • 写入成功率和延迟
    • 查询成功率和延迟
    • 系统资源使用率(CPU、内存、磁盘、网络)
    • TSM和WAL文件使用情况
    • 序列数量
    • 缓存命中率
  • 建议监控频率

    • 实时指标:1秒
    • 性能指标:10秒
    • 资源指标:1分钟
    • 趋势指标:5分钟

2. 设置合理的告警阈值

  • 基于历史数据

    • 根据历史数据分布设置告警阈值
    • 避免过于敏感,导致频繁告警
    • 建议使用P95或P99值作为阈值
  • 分级告警

    • 警告:潜在问题,需要关注
    • 严重:严重问题,需要立即处理
    • 紧急:系统故障,需要立即修复

3. 监控数据保留

  • 设置合理的保留策略

    • 实时监控数据:7天
    • 历史趋势数据:30天
    • 长期归档数据:1年
  • 使用降采样

    • 对长期数据进行降采样,减少存储占用
    • 例如:1分钟数据保留7天,5分钟数据保留30天,1小时数据保留1年

4. 定期分析监控数据

  • 每日分析

    • 查看当天的告警记录
    • 检查性能指标变化
    • 识别异常模式
  • 每周分析

    • 分析本周的性能趋势
    • 比较与上周的差异
    • 预测未来趋势
  • 每月分析

    • 进行全面的性能评估
    • 识别长期趋势
    • 制定优化计划

5. 自动化监控

  • 自动化部署监控

    • 使用配置管理工具(如Ansible)自动化部署监控
    • 确保所有环境的监控配置一致
  • 自动化告警处理

    • 实现自动告警升级
    • 配置告警静默规则
    • 自动化常见问题的处理

常见问题(FAQ)

Q1: 如何开启InfluxDB的内部监控?

A1: 开启内部监控的方法包括:

  • 在配置文件中设置store-enabled = true(1.x)或enabled = true(2.x)
  • 调整监控数据的保留时长和采集间隔
  • 重启InfluxDB服务使配置生效

Q2: InfluxDB的内部监控数据存储在哪里?

A2: 内部监控数据存储位置:

  • 1.x版本:存储在_internal数据库中
  • 2.x版本:存储在_monitoring_tasks内部桶中

Q3: 如何查看InfluxDB的内部监控数据?

A3: 查看内部监控数据的方法包括:

  • 使用InfluxQL或Flux查询内部数据库/桶
  • 通过Grafana仪表盘可视化查看
  • 使用Prometheus和Alertmanager监控

Q4: 如何监控InfluxDB的慢查询?

A4: 监控慢查询的方法包括:

  • 在配置文件中设置log-queries-after参数
  • 查看InfluxDB日志中的慢查询记录
  • 使用内部监控数据中的查询执行时间指标
  • 在Grafana中创建慢查询仪表盘

Q5: 如何监控InfluxDB的写入性能?

A5: 监控写入性能的方法包括:

  • 查看写入成功率和延迟指标
  • 监控WAL文件的数量和大小
  • 检查磁盘I/O性能
  • 分析写入错误率

Q6: 如何监控InfluxDB的内存使用情况?

A6: 监控内存使用情况的方法包括:

  • 查看运行时指标中的内存分配和使用情况
  • 监控缓存大小和命中率
  • 使用系统级监控工具(如top、free)
  • 分析内存增长趋势

Q7: 如何设置InfluxDB的告警?

A7: 设置告警的方法包括:

  • 1.x版本:使用连续查询和自定义脚本
  • 2.x版本:使用任务和告警规则
  • 集成第三方监控工具(如Prometheus + Alertmanager)
  • 配置邮件、Slack等通知渠道

Q8: 如何优化InfluxDB的监控性能?

A8: 优化监控性能的方法包括:

  • 调整监控数据的采集间隔
  • 设置合理的保留策略
  • 对监控数据进行降采样
  • 减少不必要的监控指标
  • 确保监控数据的存储和查询性能

Q9: 如何监控InfluxDB集群的健康状态?

A9: 监控集群健康状态的方法包括:

  • 检查集群成员状态
  • 监控分片分布和状态
  • 分析集群复制延迟
  • 测试集群写入和查询功能
  • 监控集群节点的资源使用率

Q10: 如何使用InfluxDB监控其他应用?

A10: 使用InfluxDB监控其他应用的方法包括:

  • 使用Telegraf采集应用指标
  • 配置应用直接写入InfluxDB
  • 使用Prometheus作为中间层
  • 创建自定义监控脚本
  • 导入或创建适合的Grafana仪表盘