TDengine 应用案例 — IT 运维与可观测性

分类 :15.应用案例 | 篇章 :05 IT 运维

免费详情

电力行业的时序数据涵盖发电、输电、配电、用电全链路。本文以一个虚拟的智能电网监控系统为例,展示 TDengine 在能源场景的应用。

IT 运维监控是 TDengine 又一典型应用:系统指标、应用 APM、日志、追踪等可观测性数据具有典型的时序特征。本文展示如何用 TDengine 构建一体化可观测性平台。

场景速查表

维度 参数
服务器 5000 台
容器 5 万个
指标点 100 万
频率 10~60s
数据量 100 GB/天

详细解析

1. 可观测性三大支柱

复制代码
Metrics(指标)
  - 时序数值
  - CPU/内存/QPS/延迟
  - TDengine 强项

Logs(日志)
  - 文本事件
  - 应用错误/审计
  - TDengine + 文本字段

Traces(追踪)
  - 调用链
  - Span/Span 间关系
  - 通常用专门工具(Jaeger/Tempo)


本文重点:Metrics(也涉及 Logs 部分场景)

2. 数据建模

sql 复制代码
-- 1. 数据库
CREATE DATABASE observability 
  PRECISION 'ms' 
  KEEP 90 
  DURATION 7 
  REPLICA 3 
  VGROUPS 16 
  CACHEMODEL 'last_value';

USE observability;


-- 2. 系统指标
CREATE STABLE host_metrics (
  ts TIMESTAMP,
  cpu_user FLOAT,
  cpu_sys FLOAT,
  cpu_iowait FLOAT,
  cpu_idle FLOAT,
  mem_total BIGINT,
  mem_used BIGINT,
  mem_free BIGINT,
  mem_cached BIGINT,
  disk_used BIGINT,
  disk_free BIGINT,
  net_rx_bytes BIGINT,
  net_tx_bytes BIGINT,
  load1 FLOAT,
  load5 FLOAT,
  load15 FLOAT
) TAGS (
  hostname NCHAR(50),
  ip BINARY(20),
  os NCHAR(20),
  region NCHAR(20),
  cluster NCHAR(30),
  env NCHAR(20)
);


-- 3. 应用指标
CREATE STABLE app_metrics (
  ts TIMESTAMP,
  qps FLOAT,
  latency_p50 FLOAT,
  latency_p99 FLOAT,
  error_count INT,
  active_threads INT,
  heap_used BIGINT,
  gc_count INT,
  gc_time_ms INT,
  connection_count INT
) TAGS (
  app_name NCHAR(50),
  instance_id BINARY(50),
  version NCHAR(20),
  env NCHAR(20),
  region NCHAR(20)
);


-- 4. HTTP 接口指标
CREATE STABLE http_metrics (
  ts TIMESTAMP,
  request_count INT,
  latency_p50 FLOAT,
  latency_p99 FLOAT,
  status_2xx INT,
  status_4xx INT,
  status_5xx INT,
  bytes_sent BIGINT
) TAGS (
  service NCHAR(50),
  endpoint NCHAR(100),
  method BINARY(10),
  env NCHAR(20)
);


-- 5. 容器指标
CREATE STABLE container_metrics (
  ts TIMESTAMP,
  cpu_usage_pct FLOAT,
  mem_usage_bytes BIGINT,
  mem_limit_bytes BIGINT,
  net_rx_bytes BIGINT,
  net_tx_bytes BIGINT,
  restart_count INT
) TAGS (
  container_id BINARY(64),
  pod_name NCHAR(100),
  namespace NCHAR(50),
  node NCHAR(50),
  cluster NCHAR(30)
);


-- 6. 日志事件
CREATE STABLE app_logs (
  ts TIMESTAMP,
  level TINYINT,
  message NCHAR(500),
  exception NCHAR(2000)
) TAGS (
  app_name NCHAR(50),
  instance_id BINARY(50),
  host NCHAR(50)
);

3. 数据采集

复制代码
采集器选型:

  ① Telegraf:通用
     - host_metrics, container_metrics
     - 通过 InfluxDB Line 写入

  ② Prometheus + remote_write:
     - 已有 Prometheus 体系
     - 长期存储到 TDengine

  ③ 应用直推:
     - app_metrics, http_metrics
     - SDK 直接写入 TDengine

  ④ Logstash / Fluent-bit:
     - app_logs
     - 通过 Schemaless 写入


Telegraf 配置示例:

[[inputs.cpu]]
  percpu = false
  totalcpu = true

[[inputs.mem]]
[[inputs.disk]]
[[inputs.net]]

[[outputs.http]]
  url = "http://taosadapter:6041/influxdb/v1/write?db=observability"
  username = "root"
  password = "taosdata"
  data_format = "influx"

4. 监控告警

sql 复制代码
-- 1. CPU 高负载主机
SELECT tbname, hostname, 
       AVG(cpu_user + cpu_sys) AS cpu_pct 
FROM host_metrics 
WHERE ts > NOW - 5m 
PARTITION BY tbname, hostname 
HAVING cpu_pct > 80;


-- 2. 内存预警
SELECT hostname, 
       LAST(mem_used) * 100.0 / LAST(mem_total) AS mem_pct 
FROM host_metrics 
WHERE ts > NOW - 5m 
PARTITION BY hostname 
HAVING mem_pct > 90;


-- 3. 磁盘满预警
SELECT hostname, 
       LAST(disk_used) * 100.0 / (LAST(disk_used) + LAST(disk_free)) AS pct 
FROM host_metrics 
WHERE ts > NOW - 5m 
PARTITION BY hostname 
HAVING pct > 85;


-- 4. 应用错误突增
SELECT app_name, 
       SUM(error_count) AS errors 
FROM app_metrics 
WHERE ts > NOW - 5m 
PARTITION BY app_name 
HAVING errors > 100;


-- 5. 接口慢
SELECT service, endpoint, 
       AVG(latency_p99) AS p99 
FROM http_metrics 
WHERE ts > NOW - 5m 
PARTITION BY service, endpoint 
HAVING p99 > 1000;


-- 6. 5xx 错误率
SELECT service, 
       SUM(status_5xx) * 100.0 / SUM(request_count) AS err_rate 
FROM http_metrics 
WHERE ts > NOW - 5m 
PARTITION BY service 
HAVING err_rate > 1.0;

5. 服务大盘

sql 复制代码
-- 1. 集群健康
SELECT cluster, 
       COUNT(DISTINCT hostname) AS hosts,
       AVG(cpu_user + cpu_sys) AS avg_cpu,
       AVG(mem_used * 100.0 / mem_total) AS avg_mem 
FROM host_metrics 
WHERE ts > NOW - 5m 
PARTITION BY cluster;


-- 2. 服务依赖图基础数据
SELECT _wstart, service, 
       SUM(request_count) AS qps,
       AVG(latency_p99) AS p99,
       SUM(status_5xx) AS errors 
FROM http_metrics 
WHERE ts > NOW - 1h 
PARTITION BY service 
INTERVAL(1m);


-- 3. GC 频繁应用
SELECT app_name, instance_id, 
       SUM(gc_count) AS total_gc,
       SUM(gc_time_ms) AS total_gc_ms 
FROM app_metrics 
WHERE ts > NOW - 1h 
PARTITION BY app_name, instance_id 
ORDER BY total_gc_ms DESC LIMIT 20;

6. 容量规划

sql 复制代码
-- 1. 集群总资源
SELECT cluster, 
       SUM(LAST(mem_total)) / 1e9 AS total_mem_gb,
       SUM(LAST(disk_used) + LAST(disk_free)) / 1e9 AS total_disk_gb 
FROM host_metrics 
PARTITION BY cluster;


-- 2. 历史增长趋势(用 TSMA 加速)
SELECT _wstart, cluster, 
       MAX(disk_used) / 1e9 AS disk_gb 
FROM host_metrics 
WHERE ts > NOW - 90d 
PARTITION BY cluster 
INTERVAL(1d);


-- 3. 增长率预测(线性外推)
WITH recent AS (
  SELECT cluster, 
    LAST(disk_used) AS now_used,
    FIRST(disk_used) AS month_ago 
  FROM host_metrics 
  WHERE ts > NOW - 30d 
  PARTITION BY cluster
)
SELECT 
  cluster, 
  now_used / 1e9 AS now_gb,
  (now_used - month_ago) / 1e9 AS month_growth_gb,
  (now_used + (now_used - month_ago) * 6) / 1e9 AS predicted_6mo 
FROM recent;

7. 异常检测

sql 复制代码
-- 1. 与历史基线比较
SELECT 
  _wstart, app_name, 
  AVG(qps) AS qps,
  (SELECT AVG(qps) FROM app_metrics 
    WHERE app_name = a.app_name 
      AND ts BETWEEN _wstart - 7d AND _wstart - 7d + 1h) AS baseline 
FROM app_metrics a 
WHERE ts > NOW - 1h 
PARTITION BY app_name 
INTERVAL(5m) 
HAVING qps < baseline * 0.5;   -- 流量突降


-- 2. 标准差异常
SELECT 
  app_name, instance_id,
  AVG(latency_p99) AS avg_lat,
  STDDEV(latency_p99) AS std_lat 
FROM app_metrics 
WHERE ts > NOW - 1d 
PARTITION BY app_name, instance_id 
HAVING std_lat > avg_lat * 0.5;

8. 日志分析

sql 复制代码
-- 1. 错误日志统计
SELECT app_name, COUNT(*) AS error_count 
FROM app_logs 
WHERE level >= 3 AND ts > NOW - 1h 
PARTITION BY app_name 
ORDER BY error_count DESC;


-- 2. 异常聚类(基于 exception 字段哈希)
SELECT 
  app_name, exception, COUNT(*) AS cnt 
FROM app_logs 
WHERE level >= 4 AND ts > NOW - 1d 
GROUP BY app_name, exception 
ORDER BY cnt DESC LIMIT 20;


-- 3. 关键字搜索(用 LIKE 或全文索引)
SELECT ts, app_name, instance_id, message 
FROM app_logs 
WHERE message LIKE '%Connection refused%' 
  AND ts > NOW - 1h;

代码示例

完整可观测性栈

复制代码
┌────────────────────────────────────────┐
│        Servers/Containers/Apps         │
└────────────────────────────────────────┘
        │ Telegraf │ Prometheus │ SDK
        ▼          ▼            ▼
┌────────────────────────────────────────┐
│              taosAdapter                │
│  InfluxDB Line / remote_write / REST   │
└────────────────────────────────────────┘
        │
        ▼
┌────────────────────────────────────────┐
│              TDengine                   │
│  ┌──────────┐  ┌──────────┐  ┌─────┐  │
│  │ Metrics  │  │   Logs   │  │ ... │  │
│  └──────────┘  └──────────┘  └─────┘  │
└────────────────────────────────────────┘
        │
        ├──→ Grafana (Dashboard)
        │
        ├──→ Stream (实时告警)
        │       │
        │       └──→ AlertManager → 通知
        │
        └──→ Query API (查询)

流计算告警

sql 复制代码
-- 1. 高 CPU 告警流
CREATE STREAM stream_cpu_alert TRIGGER AT_ONCE INTO cpu_alerts AS 
SELECT ts, hostname, cpu_user + cpu_sys AS cpu_pct 
FROM host_metrics 
WHERE cpu_user + cpu_sys > 90;


-- 2. 5 分钟错误率
CREATE STREAM stream_app_error INTO app_error_5m AS 
SELECT _wstart, app_name, SUM(error_count) AS errors 
FROM app_metrics 
PARTITION BY app_name 
INTERVAL(5m);

Grafana 模板

sql 复制代码
-- Panel: 集群 CPU 热力图
SELECT 
  _wstart AS time, 
  hostname,
  AVG(cpu_user + cpu_sys) AS value 
FROM host_metrics 
WHERE ts >= $from AND ts < $to 
PARTITION BY hostname 
INTERVAL($interval);


-- Panel: 服务 QPS 趋势
SELECT 
  _wstart AS time, 
  service,
  SUM(request_count) AS value 
FROM http_metrics 
WHERE ts >= $from AND ts < $to 
PARTITION BY service 
INTERVAL($interval);

性能考量

数据量估算

复制代码
5000 主机 × 15 测点 × 1/30s = 2500 点/秒
5 万容器 × 8 测点 × 1/30s = 13333 点/秒
1000 服务 × 10 测点 × 1/10s = 1000 点/秒
日量 ~ 14 亿条
压缩后 ~10 GB/天
保留 90 天 ~ 1 TB

TSMA 推荐

sql 复制代码
CREATE TSMA tsma_host_5m ON host_metrics 
FUNCTION(AVG(cpu_user), AVG(cpu_sys), AVG(load1), MAX(mem_used)) 
INTERVAL(5m);

CREATE TSMA tsma_host_1h ON host_metrics 
FUNCTION(AVG(cpu_user), AVG(cpu_sys), AVG(load1), MAX(mem_used)) 
INTERVAL(1h);

CREATE TSMA tsma_http_1m ON http_metrics 
FUNCTION(SUM(request_count), AVG(latency_p99), SUM(status_5xx)) 
INTERVAL(1m);

FAQ

Q1: 与 Prometheus 怎么配合?

  • 短期热数据:Prometheus(15 天)
  • 长期归档:TDengine(remote_write)
  • Grafana 同时查两个数据源

Q2: 日志数据放 TDengine 合适吗?

合适的场景:

  • 结构化日志(level + message)
  • 数据量适中(< 几亿/天)
  • 需要时序聚合

不合适:

  • 全文搜索为主 → 用 ES
  • 海量非结构化 → 用 Loki/ClickHouse

Q3: Trace 数据怎么办?

通常用专门工具(Jaeger/Tempo)。可把 Trace 摘要(duration/error)写 TDengine 做时序统计。

Q4: 容器指标怎么采?

  • cAdvisor / Telegraf k8s 插件
  • Prometheus + remote_write
  • DaemonSet 部署采集 agent

Q5: 千万级指标怎么扩展?

  • 按业务分库(每业务一个 db)
  • 按集群分片
  • 多 TDengine 集群 + 联邦查询

参考

系统构架篇

数据模型

存储引擎

查询引擎

数据写入

数据订阅

预聚合

索引

SQL 语句

客户端与连接器

运维

安全

生态

应用案例

关于 TDengine

TDengine 专为物联网IoT平台、工业大数据平台设计。其中,TDengine TSDB 是一款高性能、分布式的时序数据库(Time Series Database),同时它还带有内建的缓存、流式计算、数据订阅等系统功能;TDengine IDMP 是一款AI原生工业数据管理平台,它通过树状层次结构建立数据目录,对数据进行标准化、情景化,并通过 AI 提供实时分析、可视化、事件管理与报警等功能。

相关推荐
疯狂打码的少年13 分钟前
【数据库技术】关系代数连接运算(等值连接/自然连接/外连接)
jvm·数据库·笔记·oracle
小王C语言19 分钟前
MySQL 视图:视图是什么,视图和基表之间的关系
数据库·mysql
程序员-Benothing21 分钟前
什么是 MySQL 的主从同步机制?它是如何实现的?
android·数据库·mysql
金立基包装胶水23 分钟前
水性纸袋热封胶,常见故障有多少种?
大数据·笔记·其他
Wang's Blog25 分钟前
Vibe Coding一人即团队系列31:基于Claude Code实现登录注册与数据库联动
数据库·人工智能
geneculture25 分钟前
从融智学到人机互助:技术成果交易的理论重构与战略前瞻——基于“九五至尊模型”与融智学三大判断的分析
大数据·人工智能·融智学的重要应用·哲学与科学统一性·融智时代(杂志)·序位逻辑的实例化·中国企业知识产权战略专栏
lvts_cs27 分钟前
如何判断化工产业规划的定位布局是否合理
大数据·人工智能
观无28 分钟前
.net发布注意事项
运维·服务器
2601_9620566028 分钟前
Spring Boot——日志介绍和配置
java·数据库·spring boot