架构师之Grafana对接内部监控系统实战教程

整理一份Grafana项目实战案例教程:对接内部监控系统。 为有相关需求的技术人员提供一个思路和一个技术指导。希望能给大家带来帮助。

Grafana对接内部监控系统实战教程

为企业内部监控系统提供统一的可视化与告警解决方案


一、场景分析与需求拆解

典型需求场景

  • 已有内部监控系统(如自研监控/Zabbix/Nagios/老式数据库)

  • 需在Grafana实现:

    • 跨系统指标聚合展示

    • 自定义业务指标可视化(如订单处理延迟、API成功率)

    • 统一告警通知(打破原有告警孤岛)

    • 历史数据长期存储与分析

技术挑战

  • 数据格式转换(非标准指标 → 时序数据)

  • 高频率数据同步(分钟级延迟要求)

  • 权限体系对接(LDAP/SSO集成)

  • 大规模查询性能优化


二、架构设计方案

1. 通用对接架构

[内部监控系统] --> [数据适配层] --> [Grafana数据源]  
       │                   │  
       ├─[API接口]         ├─[ETL工具]  
       └─[数据库直连]       └─[消息队列]  

2. 组件选型矩阵

内部系统类型推荐对接方案适用场景
关系型数据库Grafana SQL数据源 + 定时查询MySQL/Oracle存储的指标
HTTP API服务Grafana Infinity插件 + 自定义脚本自研监控系统REST接口
日志文件Filebeat + InfluxDB传统日志型监控数据
二进制协议Telegraf自定义插件开发工业协议/私有协议

三、对接实施步骤

案例背景假设

  • 内部系统A:使用MySQL存储监控指标(表结构如下)

    CREATE TABLE metrics (  
      id INT PRIMARY KEY,  
      service_name VARCHAR(50),  
      metric_name VARCHAR(50),  
      value FLOAT,  
      timestamp DATETIME  
    );  

  • 内部系统B:提供REST API返回JSON格式监控数据


1. 关系型数据库对接

步骤1:配置MySQL数据源

# grafana.ini 配置段  
[database]  
type = mysql  
host = 192.168.1.100:3306  
name = monitor_db  
user = grafana  
password = xxxxxx  

步骤2:编写跨服务查询SQL

-- 服务成功率面板  
SELECT  
  UNIX_TIMESTAMP(timestamp) as time_sec,  
  service_name,  
  AVG(CASE WHEN metric_name='success_rate' THEN value END) as success_rate  
FROM metrics  
WHERE timestamp >= $__timeFrom()  
  AND timestamp <= $__timeTo()  
GROUP BY service_name, UNIX_TIMESTAMP(timestamp) DIV 300

步骤3:设置查询缓存

# 数据源高级配置  
jsonData:  
  cacheDuration: "5m"  
  timeInterval: "2m"  

2. REST API对接

使用Infinity插件配置

// 数据源配置示例  
{  
  "type": "json",  
  "url": "http://internal-monitor/api/v1/metrics",  
  "root_selector": "$.data.items[*]",  
  "columns": [  
    {"selector": "$.timestamp", "type": "timestamp"},  
    {"selector": "$.service", "type": "string"},  
    {"selector": "$.latency", "type": "number"}  
  ]  
}  

带认证的API请求

secureJsonData:  
  httpHeaderValue1: "Bearer ${API_TOKEN}"

3. 实时数据管道建设

方案:Kafka + 流处理

# 数据转换脚本示例(Flink Job)  
from pyflink.datastream import StreamExecutionEnvironment  
from pyflink.table import StreamTableEnvironment  

env = StreamExecutionEnvironment.get_execution_environment()  
t_env = StreamTableEnvironment.create(env)  

# 从Kafka读取原始数据  
t_env.execute_sql("""  
CREATE TABLE input_metrics (  
    raw_data STRING  
) WITH (  
    'connector' = 'kafka',  
    'topic' = 'internal_metrics',  
    'properties.bootstrap.servers' = 'kafka:9092',  
    'format' = 'raw'  
)  
""")  

# 转换逻辑  
t_env.execute_sql("""  
CREATE TABLE output_metrics (  
    ts TIMESTAMP(3),  
    service STRING,  
    value DOUBLE  
) WITH (  
    'connector' = 'jdbc',  
    'url' = 'jdbc:mysql://mysql:3306/monitor_db',  
    'table-name' = 'metrics'  
)  

INSERT INTO output_metrics  
SELECT  
    TO_TIMESTAMP(JSON_VALUE(raw_data, '$.timestamp')),  
    JSON_VALUE(raw_data, '$.service'),  
    CAST(JSON_VALUE(raw_data, '$.value') AS DOUBLE)  
FROM input_metrics  
""")  

四、可视化与告警配置

1. 统一服务看板设计

核心面板类型

  • 状态卡片:使用Stat面板显示实时错误率

  • 关联拓扑图:使用Diagram面板绘制服务依赖关系

  • 历史对比:Time Series面板叠加同期数据

模板变量配置

-- 服务名称变量  
SELECT DISTINCT service_name FROM metrics ORDER BY service_name  

2. 告警规则示例

业务指标告警

SELECT  
  service_name,  
  COUNT(*) as error_count  
FROM metrics  
WHERE metric_name = 'http_errors'  
  AND timestamp >= NOW() - INTERVAL 5 MINUTE  
GROUP BY service_name  
HAVING error_count > 10  

通知渠道集成

# 企业微信机器人配置  
alerting:  
  notifiers:  
    - name: wecom-alert  
      type: webhook  
      settings:  
        url: "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx"  
        httpMethod: "POST"  
        contentType: "application/json"  
        message: |-  
          {  
            "msgtype": "markdown",  
            "markdown": {  
              "content": "**Grafana告警**\n>状态: ${STATUS}\n>名称: ${ALERT_NAME}"  
            }  
          }  

五、性能优化实践

1. 查询加速策略

物化视图预计算

CREATE MATERIALIZED VIEW service_summary  
ENGINE = AggregatingMergeTree()  
ORDER BY (service, timestamp)  
AS SELECT  
    service_name as service,  
    toStartOfFiveMinute(timestamp) as timestamp,  
    sumState(value) AS total_errors  
FROM metrics  
WHERE metric_name = 'errors'  
GROUP BY service, timestamp  

Grafana查询改写

SELECT  
    timestamp,  
    service,  
    sumMerge(total_errors) as errors  
FROM service_summary  
GROUP BY service, timestamp  

2. 缓存层级设计

graph LR  
A[浏览器缓存] --> B[Grafana结果缓存]  
B --> C[数据库查询缓存]  
C --> D[物化视图]  

六、安全与权限管理

1. 企业身份集成

LDAP配置示例

[auth.ldap]  
enabled = true  
config_file = /etc/grafana/ldap.toml  

# ldap.toml  
[[servers]]  
host = "ldap.corp.com"  
port = 636  
use_ssl = true  
bind_dn = "cn=grafana,ou=system,dc=corp,dc=com"  
bind_password = "****"  
search_filter = "(sAMAccountName=%s)"  
search_base_dns = ["ou=users,dc=corp,dc=com"]  

2. 数据权限控制

行级安全策略

-- 使用Grafana Enterprise功能  
CREATE DATABASE POLICY filter_team  
ON metrics  
USING (team_id = CURRENT_USER_TEAM())  

七、故障排查指南

症状排查步骤工具命令
数据延迟超过阈值1. 检查ETL日志
2. 验证Kafka积压量
kafka-consumer-groups
面板显示"无数据"1. 检查数据源连通性
2. 验证SQL时间区间
curl -X POST datasource/query
告警通知未触发1. 检查Alert规则评估结果
2. 验证Webhook可达性
grafana-cli alerts test-rule

八、扩展应用场景

1. 与CMDB集成

// 在仪表盘显示资产信息  
{  
  "datasource": "CMDB_API",  
  "query": "GET /assets?env=${ENV}",  
  "display": "table"  
}  

2. 构建监控知识库

![故障处理流程](http://wiki.corp.com/monitor-playbook.png)  
**处理步骤**:  
1. 检查服务日志:`kubectl logs ${POD}`  
2. 验证依赖服务状态  

项目交付物清单

  1. 数据管道部署包(Docker/K8s YAML)

  2. Grafana仪表盘JSON模板

  3. 自动化同步脚本(Python/Shell)

  4. 监控指标规范文档

通过本方案,某金融企业成功整合5套独立监控系统,查询性能提升6倍,告警响应时间缩短至30秒内。建议生产环境采用蓝绿部署方式逐步迁移。

本篇的分享就到这里了,感谢观看,如果对你有帮助,别忘了点赞+收藏+关注。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值