开启部署版自身的可观测¶
概述¶
本文档的目的在于能够帮助私有部署版用户,如何对部署版实施可观测,以提升整体观测云服务的运行可靠性。此篇讲述了2种经典的可观测模式,以及在 Kubernetes 的环境下如何部署 Datakit 数据采集、日志及切割、应用性能监测、可用性监测、用户访问监测 等。此外,我们还提供了基础设施及中间件观测 和 应用服务观测的一键导入模板文件,方便大家更好的使用以便观测自身环境。
部署版可观测模式¶
账号信息准备¶
名称 | 类型 | 说明 | 创建语法(注意修改密码) | 重要程度 |
---|---|---|---|---|
私有 FUNC 数据库账号 | DB & USER | FUNC 服务连接账号 | CREATE DATABASE private_func; create user 'private_func'@'%' identified by 'V4KySbFhzDkxxxx'; GRANT ALL PRIVILEGES ON private_func.* TO private_func; FLUSH PRIVILEGES; |
可选 |
MySQL 自观测账号 | USER | 自观测账号,采集MySQL 指标 | CREATE USER 'datakit'@'%' IDENTIFIED WITH caching_sha2_password by 'SFGS&DFxxxx32!'; GRANT PROCESS ON . TO 'datakit'@'%'; GRANT SELECT ON . TO 'datakit'@'%'; show databases like 'performance_schema'; GRANT SELECT ON performance_schema.* TO 'datakit'@'%'; GRANT SELECT ON mysql.user TO 'datakit'@'%'; GRANT replication client on . to 'datakit'@'%'; |
重要 |
业务数据采集账号 | USER | 使用 FUNC 采集业务数据使用 | CREATE USER 'read'@'%' IDENTIFIED BY 'u19e0LmkL8Fxxxx'; GRANT SELECT ON df_core.* TO 'read'@'%'; FLUSH PRIVILEGES; |
可选 |
PostgreSQL 自观测账号 | USER | GuanceDB 3.0 监控使用 | CREATE USER datakit WITH PASSWORD 'Z7ZdQ326EeexxxxP'; GRANT pg_monitor TO datakit; GRANT CONNECT ON DATABASE scopedb_meta TO datakit; GRANT SELECT ON pg_stat_database TO datakit; |
可选 |
配置数据采集¶
部署 DataKit¶
注意
注意:以上DataKit默认的配置中间件配置都已配置完毕,稍作修改即可使用。
2)修改 datakit.yaml DaemonSet
的模板文件
- name: ENV_DATAWAY
value: https://openway.guance.com?token=tkn_a624xxxxxxxxxxxxxxxxxxxxxxxx74 ## 此处填上 dataway 真实地址
- name: ENV_GLOBAL_TAGS
value: host=__datakit_hostname,host_ip=__datakit_ip,guance_site=guance,cluster_name_k8s=guance # 面板变量根据自己实际情况修改
- name: ENV_GLOBAL_ELECTION_TAGS
value: guance_site=guance,cluster_name_k8s=guance # 根据自己面板变量实际情况修改
image: pubrepo.guance.com/datakit/datakit:1.65.2 ## 修改成最新镜像版本
3)修改 datakit.yaml 中关于ConfigMap
的相关配置
apiVersion: v1
kind: ConfigMap
metadata:
name: datakit-conf
namespace: datakit
data:
mysql.conf: |-
[[inputs.mysql]]
host = "xxxxxxxxxxxxxxx" ##修改对应MySQL连接地址
user = "ste3" ##修改MySQL用户名
pass = "Test1234" ##修改MySQL密码
......
redis.conf: |-
[[inputs.redis]]
host = "r-xxxxxxxxx.redis.rds.ops.ste3.com" ## 修改Redis连接地址
port = 6379
# unix_socket_path = "/var/run/redis/redis.sock"
# 配置多个db,配置了dbs,db也会放入采集列表。dbs=[]或者不配置则会采集redis中所有非空的db
# dbs=[]
# username = "<USERNAME>"
password = "Test1234" ## 修改Redis密码
......
openes.conf: |-
[[inputs.elasticsearch]]
## Elasticsearch服务器配置
# 支持Basic认证:
# servers = ["http://user:pass@localhost:9200"]
servers = ["http://guance:123.com@opensearch-cluster-client.middleware:9200"] ## 修改用户名、密码等
......
4)挂载操作
- mountPath: /usr/local/datakit/conf.d/db/mysql.conf
name: datakit-conf
subPath: mysql.conf
readOnly: false
注意:多个配置也是一样的。依次添加下去。
6)修改后开始部署DataKit
环境变量说明¶
变量名称 | 说明 |
---|---|
ENV_DEFAULT_ENABLED_INPUTS | 配置默认采集: self,cpu,disk,diskio,mem,swap,system,hostobject,net,host_processes,container,zipkin |
ENV_ENABLE_ELECTION | 启用选举机制后,Prometheus 采集(或其他组件)会以主节点或候选节点方式工作 |
ENV_GLOBAL_ELECTION_TAGS | 在选举组件中添加额外的标签维度,对 Prometheus 采集时打标签使用(在选举开启时有效) |
ENV_INPUT_DDTRACE_COMPATIBLE_OTEL | 启用otel Trace 与 DDTrace Trace 兼容 |
ENV_INPUT_DISK_USE_NSENTER | 用 nsenter 方式来采集磁盘用量信息,采集集群动态存储块信息,如果使用动态存储块存储,一定要设置 |
ENV_INPUT_HOSTOBJECT_USE_NSENTER | 用 nsenter 方式来采集磁盘用量信息,采集集群动态存储块信息,如果使用动态存储块存储,一定要设置 |
ENV_INPUT_CONTAINER_ENABLE_CONTAINER_METRIC | 开启容器指标采集 |
ENV_INPUT_CONTAINER_ENABLE_POD_METRIC | 开启 Pod 指标采集(CPU 和内存使用情况) |
ENV_INPUT_CONTAINER_ENABLE_K8S_METRIC | 开启 k8s 指标采集 |
导入视图、监控器模板及 Pipelines¶
注意
导入监控模板之后,需手动设置告警策略和告警通知对象。
导入视图、监控器模板¶
下载视图及监控器模板
「管理」-「空间设置」-「导入」
注意
导入后监控要修改相应的跳转链接配置。要把 url 中的 dsbd_xxxx 换到对应的仪表板下,wksp_xxxx 换成要监测的空间下。
导入 Pipelines¶
解压 guance-self-observing-latest.zip 文件,路径:guance-self-observing-latest/pipeline
「管理」-「Pipelines」-「导入」
应用服务观测¶
配置服务 prom 采集¶
解压 guance-self-observing-prom-latest.zip ,并执行以下命令:
cd guance-self-observing-prom-latest
kubectl patch deploy kodo-x -n forethought-kodo --type merge --patch "$(cat kodo-x-prom.yaml)"
kubectl patch deploy kodo -n forethought-kodo --type merge --patch "$(cat kodo-prom.yaml)"
kubectl patch sts kodo-servicemap -n forethought-kodo --type merge --patch "$(cat kodo-servicemap-prom.yaml)"
kubectl patch sts kodo-x-backuplog -n forethought-kodo --type merge --patch "$(cat kodo-x-backuplog-prom.yaml)"
kubectl patch deploy inner -n forethought-core --type merge --patch "$(cat core-inner-prom.yaml)"
配置应用性能监测¶
注入 forethought-core 配置¶
#!/bin/bash
set -euo pipefail
# 命名空间
NAMESPACE="${NAMESPACE:-forethought-core}"
# —— 每个 deployment 的专属 KV 写在这里(脚本里,不用外部文件)——
# 一行一个:"<deploy> KEY=VAL KEY=VAL ..."
DEPLOY_ENV_CONFIG=(
'front-backend DD_PATCH_MODULES=redis:true,urllib3:true,httplib:true,sqlalchemy:true,httpx:true DD_AGENT_PORT=9529 DD_GEVENT_PATCH_ALL=true DD_SERVICE=front-backend DD_TAGS=pod_name:$(POD_NAME),project:dataflux'
'inner DD_PATCH_MODULES=redis:true,urllib3:true,httplib:true,sqlalchemy:true,httpx:true DD_AGENT_PORT=9529 DD_GEVENT_PATCH_ALL=true DD_SERVICE=inner DD_TAGS=pod_name:$(POD_NAME),project:dataflux'
'management-backend DD_PATCH_MODULES=redis:true,urllib3:true,httplib:true,sqlalchemy:true,httpx:true DD_AGENT_PORT=9529 DD_GEVENT_PATCH_ALL=true DD_SERVICE=management-backend DD_TAGS=pod_name:$(POD_NAME),project:dataflux'
'open-api DD_PATCH_MODULES=redis:true,urllib3:true,httplib:true,sqlalchemy:true,httpx:true DD_AGENT_PORT=9529 DD_GEVENT_PATCH_ALL=true DD_SERVICE=open-api DD_TAGS=pod_name:$(POD_NAME),project:dataflux'
'sse DD_PATCH_MODULES=redis:true,urllib3:true,httplib:true,sqlalchemy:true,httpx:true DD_AGENT_PORT=9529 DD_GEVENT_PATCH_ALL=true DD_SERVICE=sse DD_TAGS=pod_name:$(POD_NAME),project:dataflux'
'core-worker DD_TRACE_ENABLED=false'
'core-worker-0 DD_TRACE_ENABLED=false'
'core-worker-beat DD_TRACE_ENABLED=false'
'core-worker-correlation DD_TRACE_ENABLED=false'
)
# —— 只在 args[0] 前置 ddtrace-run(不修改 command)——
prefix_ddtrace_run_args_only() { # $1 deploy
local d="$1"
# 若明确禁用 tracing,则不加
local trace_enabled
trace_enabled="$(kubectl get deploy "$d" -n "$NAMESPACE" \
-o jsonpath='{.spec.template.spec.containers[0].env[?(@.name=="DD_TRACE_ENABLED")].value}' 2>/dev/null || true)"
if [[ "$trace_enabled" == "false" ]]; then
echo " • DD_TRACE_ENABLED=false,跳过 ddtrace-run。"
return 0
fi
# 读取 args[0]
local first_arg
first_arg="$(kubectl get deploy "$d" -n "$NAMESPACE" \
-o jsonpath='{.spec.template.spec.containers[0].args[0]}' 2>/dev/null || true)"
# 已经是 ddtrace-run 就跳过
if [[ "$first_arg" == "ddtrace-run" ]]; then
echo " • args 已以 ddtrace-run 开头,跳过。"
return 0
fi
# 判断是否已有 args 数组
local has_args
has_args="$(kubectl get deploy "$d" -n "$NAMESPACE" \
-o jsonpath='{.spec.template.spec.containers[0].args}' 2>/dev/null || true)"
if [[ -n "$has_args" ]]; then
# 在现有 args 开头插入 ddtrace-run
kubectl patch deploy "$d" -n "$NAMESPACE" --type='json' -p='[
{"op":"add","path":"/spec/template/spec/containers/0/args/0","value":"ddtrace-run"}
]' >/dev/null
echo " • 已在 args[0] 插入 ddtrace-run"
else
# 若没有 args,创建 args 并将 ddtrace-run 作为第一个元素
kubectl patch deploy "$d" -n "$NAMESPACE" --type='json' -p='[
{"op":"add","path":"/spec/template/spec/containers/0/args","value":["ddtrace-run"]}
]' >/dev/null
echo " • 无 args:已创建 args=[\"ddtrace-run\"]"
fi
}
# —— 小工具函数 —— #
has_env() { # $1 deploy $2 KEY
kubectl get deploy "$1" -n "$NAMESPACE" \
-o jsonpath="{.spec.template.spec.containers[0].env[?(@.name=='$2')].name}" 2>/dev/null | grep -qx "$2"
}
ensure_env_array() { # $1 deploy
local has_array
has_array="$(kubectl get deploy "$1" -n "$NAMESPACE" -o jsonpath="{.spec.template.spec.containers[0].env}" 2>/dev/null || true)"
if [[ -z "${has_array}" ]]; then
kubectl patch deploy "$1" -n "$NAMESPACE" --type='json' -p="[
{\"op\":\"add\",\"path\":\"/spec/template/spec/containers/0/env\",\"value\":[]}
]" >/dev/null
fi
}
for item in "${DEPLOY_ENV_CONFIG[@]}"; do
deploy="${item%% *}"
# 若该行只有部署名,跳过
rest="${item#* }"; [[ "$rest" == "$deploy" ]] && rest=""
echo "→ Processing: $deploy"
# 是否存在
if ! kubectl get deploy "$deploy" -n "$NAMESPACE" >/dev/null 2>&1; then
echo " - Not found, skip."
continue
fi
# 确保有 env 数组(否则 /env/- 追加会失败)
ensure_env_array "$deploy"
# 追加 Downward API(缺则加):DD_AGENT_HOST=status.hostIP、POD_NAME=metadata.name
if ! has_env "$deploy" "DD_AGENT_HOST"; then
kubectl patch deploy "$deploy" -n "$NAMESPACE" --type='json' -p='[
{"op":"add","path":"/spec/template/spec/containers/0/env/-",
"value":{"name":"DD_AGENT_HOST","valueFrom":{"fieldRef":{"apiVersion":"v1","fieldPath":"status.hostIP"}}}}
]' >/dev/null
echo " • add DD_AGENT_HOST (status.hostIP)"
else
echo " • DD_AGENT_HOST exists, skip."
fi
if ! has_env "$deploy" "POD_NAME"; then
kubectl patch deploy "$deploy" -n "$NAMESPACE" --type='json' -p='[
{"op":"add","path":"/spec/template/spec/containers/0/env/-",
"value":{"name":"POD_NAME","valueFrom":{"fieldRef":{"apiVersion":"v1","fieldPath":"metadata.name"}}}}
]' >/dev/null
echo " • add POD_NAME (metadata.name)"
else
echo " • POD_NAME exists, skip."
fi
# 逐个静态 KEY=VAL(缺则加;有则跳过)
for kv in $rest; do
key="${kv%%=*}"
val="${kv#*=}"
if has_env "$deploy" "$key"; then
echo " • $key exists, skip."
else
kubectl set env deploy/"$deploy" -n "$NAMESPACE" "$key=$val" >/dev/null
echo " • add $key=$val"
fi
done
# 确保启动命令前置 ddtrace-run
prefix_ddtrace_run_args_only "$deploy"
echo " -> Done: $deploy"
done
注入 forethought-kodo 配置¶
#!/bin/bash
set -euo pipefail
# 命名空间
NAMESPACE="${NAMESPACE:-forethought-kodo}"
# —— 每个 deployment 的专属 KV 写在这里(脚本里,不用外部文件)——
# 一行一个:"<deploy> KEY=VAL KEY=VAL ..."
DEPLOY_ENV_CONFIG=(
'kodo DD_TRACE_ENABLED=true DD_TRACE_AGENT_PORT=9529 DD_TRACE_SAMPLE_RATE=0 DD_SERVICE=kodo DD_TAGS=pod_name:$(POD_NAME),project:dataflux'
'kodo-inner DD_TRACE_ENABLED=true DD_TRACE_AGENT_PORT=9529 DD_SERVICE=kodo-inner DD_TAGS=pod_name:$(POD_NAME),project:dataflux'
)
# —— 小工具函数 —— #
has_env() { # $1 deploy $2 KEY
kubectl get deploy "$1" -n "$NAMESPACE" \
-o jsonpath="{.spec.template.spec.containers[0].env[?(@.name=='$2')].name}" 2>/dev/null | grep -qx "$2"
}
ensure_env_array() { # $1 deploy
local has_array
has_array="$(kubectl get deploy "$1" -n "$NAMESPACE" -o jsonpath="{.spec.template.spec.containers[0].env}" 2>/dev/null || true)"
if [[ -z "${has_array}" ]]; then
kubectl patch deploy "$1" -n "$NAMESPACE" --type='json' -p="[
{\"op\":\"add\",\"path\":\"/spec/template/spec/containers/0/env\",\"value\":[]}
]" >/dev/null
fi
}
for item in "${DEPLOY_ENV_CONFIG[@]}"; do
deploy="${item%% *}"
# 若该行只有部署名,跳过
rest="${item#* }"; [[ "$rest" == "$deploy" ]] && rest=""
echo "→ Processing: $deploy"
# 是否存在
if ! kubectl get deploy "$deploy" -n "$NAMESPACE" >/dev/null 2>&1; then
echo " - Not found, skip."
continue
fi
# 确保有 env 数组(否则 /env/- 追加会失败)
ensure_env_array "$deploy"
# 追加 Downward API(缺则加):DD_AGENT_HOST=status.hostIP、POD_NAME=metadata.name
if ! has_env "$deploy" "DD_AGENT_HOST"; then
kubectl patch deploy "$deploy" -n "$NAMESPACE" --type='json' -p='[
{"op":"add","path":"/spec/template/spec/containers/0/env/-",
"value":{"name":"DD_AGENT_HOST","valueFrom":{"fieldRef":{"apiVersion":"v1","fieldPath":"status.hostIP"}}}}
]' >/dev/null
echo " • add DD_AGENT_HOST (status.hostIP)"
else
echo " • DD_AGENT_HOST exists, skip."
fi
if ! has_env "$deploy" "POD_NAME"; then
kubectl patch deploy "$deploy" -n "$NAMESPACE" --type='json' -p='[
{"op":"add","path":"/spec/template/spec/containers/0/env/-",
"value":{"name":"POD_NAME","valueFrom":{"fieldRef":{"apiVersion":"v1","fieldPath":"metadata.name"}}}}
]' >/dev/null
echo " • add POD_NAME (metadata.name)"
else
echo " • POD_NAME exists, skip."
fi
# 逐个静态 KEY=VAL(缺则加;有则跳过)
for kv in $rest; do
key="${kv%%=*}"
val="${kv#*=}"
if has_env "$deploy" "$key"; then
echo " • $key exists, skip."
else
kubectl set env deploy/"$deploy" -n "$NAMESPACE" "$key=$val" >/dev/null
echo " • add $key=$val"
fi
done
echo " -> Done: $deploy"
done
配置可用性监测¶
1)新建一个要监测的网站
2)配置拨测任务
注意
根据实际设置的域名进行修改
配置用户访问监测¶
注意
如果没有找到“使用公网 DataWay”,请修改 namespace「forethought-webclient」- configmap「front-web-config」,添加 rumDatawayUrl:<https://<Dataway 地址>
,并重启 front-webclient 服务。
1)获取 RUM 配置
登录自观测空间创建 RUM app
- App Name:观测云
- App ID: xxx_guance_com
- 获取 site
- 获取 clientToken
2)修改 forethought-webclient namespace 下 front-web-config ConfigMap
配置(参数没有就添加)
- rumEnable: 1 (1 为开启)
- rumOpenwayUrl 为 「获取的 site」
- rumClientToken 为 「获取 clientToken」
- rumApplicationId 为 「App ID」
- rumAllowedDdtracingOrigins 为 ["https://xxx-console-api.guance.com", "https://xxx-console.guance.com",]
window.DEPLOYCONFIG = {
cookieDomain: '.guance.com',
apiUrl: 'https://cn4-console-api.guance.com',
wsUrl: 'wss://.guance.com',
innerAppDisabled: 0,
innerAppLogin: 'https://cn4-auth.guance.com/redirectpage/login',
innerAppRegister: 'https://cn4-auth.guance.com/redirectpage/register',
innerAppProfile: 'https://cn4-auth.guance.com/redirectpage/profile',
innerAppCreateworkspace: 'https://cn4-auth.guance.com/redirectpage/createworkspace',
staticFileUrl: 'https://cn4-static-res.guance.com',
staticDatakit: 'https://static.guance.com',
cloudDatawayUrl: '',
isSaas: '1',
showHelp: 1,
rumEnable: 1, ## 0是关闭,1是开启,此处开启
rumOpenwayUrl: "", ## openway 地址
rumApplicationId: "", ## 修改成实际appid
rumJsUrl: "https://static.guance.com/browser-sdk/v3/dataflux-rum.js",
rumDataEnv: 'prod',
shrineApiUrl: '',
upgradeUrl: '',
rechargeUrl: '',
paasCustomLoginInfo: []
};
告警设置¶
告警策略说明¶
告警策略名称 | 告警级别 | 告警说明 | 备注 |
---|---|---|---|
P0 告警 - 飞书群 & 电话通知 | 严重 | 该策略为最高级告警,事件发生后必须立即处理。 触发条件包括: 1. 站点页面不可访问; 2. 数据无法上报或写入失败,导致数据丢失; 3. 监控器停止运行,导致用户监控失效; 4. 自动触发任务终止或失败,造成数据丢失; 5. 中间件故障,导致系统不可用或数据丢失。 |
告警通知对象建议:电话 |
基础设施告警 - 飞书群通知 | 严重、重要 | 该策略级别低于 P0 告警,事件发生后需持续关注和排查。 触发条件包括: 1. 服务异常重启; 2. 节点内存异常; 3. 节点负载过高或其他系统资源异常。 |
告警通知对象建议:普通(邮件、飞书等) |
业务告警 - 飞书群通知 | 严重、重要、警告 | 该策略为普通级告警,事件发生后建议持续关注。 触发条件包括: 1. 服务日志报错; 2. 业务逻辑相关异常。 |
告警通知对象建议:普通(邮件、飞书等) |
ScopeDB 相关服务告警 | 全部 | 该策略为普通级告警,事件发生后建议持续关注。 触发条件包括: 1. ScopeDB 服务日志报错; 2. ScopeDB 性能告警 |
告警通知对象建议:普通(邮件、飞书等) |
告警设置步骤¶
创建通知对象¶
-
登录自观测空间访问「监控」-「通知对象管理」
-
新建 3 个不同通知对象(通知对象类型不限,建议不同通知群)
- 业务告警
- 基础设施告警
- P0 告警
配置告警策略¶
「监控」- 「告警策略管理」设置通知配置
告警策略名称 | 通知配置-等级 | 通知配置-对象 | 重复告警周期 |
---|---|---|---|
基础设施告警 -飞书群 | 严重、重要 | 基础设施告警 | 30 分钟 |
P0 告警 - 飞书群 & 电话通知 | 严重 | P0 告警 | 6 小时 |
业务告警 - 飞书群通知 | 严重、重要、警告 | 业务告警 | 30 分钟 |
ScopeDB 相关服务告警 | 全部 | 业务告警 | 30 分钟 |
Func 自观测(可选)¶
Func 任务日志数据上报¶
DataFlux Func 的函数运行日志、自动触发配置等信息可以直接上报至观测云。步骤如下图
在观测云数据上报中填写 DataWay / OpenWay 地址和 Token 信息即可,格式如下:
注意:如果Func数据上报失败,可查看 DataFlux Func文档
业务监控采集(可选)¶
私有 Func 部署¶
注意,storageClass、MYSQL_HOST、MYSQL_USER、MYSQL_PASSWORD、MYSQL_DATABASE 等参数
helm install func func --repo https://pubrepo.guance.com/chartrepo/func -n datakit --create-namespace \
--set storage.pvc.enabled=true,storage.pvc.storageClass="xxxxxxxx" \
--set mysql.enabled=false,func.MYSQL_HOST='xxxxxx' \
--set func.MYSQL_USER=private_func,func.MYSQL_PASSWORD=xxxxx,func.MYSQL_DATABASE=private_func
设置 ingress¶
提前设置证书
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: xxx-private-func
namespace: datakit
spec:
ingressClassName: nginx
rules:
- host: xxx-private-func.guance.com
http:
paths:
- backend:
service:
name: func-server
port:
number: 8088
path: /
pathType: ImplementationSpecific
tls:
- hosts:
- xxx-private-func.guance.com
secretName: guance.com
初始化¶
浏览器访问域名,下一步
导入脚本¶
下载脚本包
访问「脚本集导入」-「脚本导入」
修改数据库环境变量配置¶
填写 【业务数据采集账号】信息
验证方式¶
需切换 guance_site 参数
名称 | 验证方式 | 验证操作 | |
---|---|---|---|
MySQL | DQL | M::mysql :(avg(max_connections )) { guance_site = 'xxx' } BY host |
|
Redis | DQL | M::redis_info :(avg(maxmemory )) { guance_site = 'xxx' } BY host |
|
PostgreSQL | DQL | M::postgresql_connection :(max(percent_usage_connections )) { guance_site = 'xxx' } |
|
NSQD | DQL | M::nsq_topics :(max(message_count )) { guance_site = 'xxx' } BY topic |
|
DataWay | DQL | M::dw :(max(dataway_cpu_cores )) { guance_site = 'xxx' } BY guance_site |
|
Studio 链路 | DQL | T::front-backend :(count(* )) { guance_site = 'xxx' } BY guance_site |
|
Kodo-inner 链路 | DQL | T::kodo-inner :(count(* )) { guance_site = 'xxx' } BY guance_site |
|
Kodo 指标 | DQL | M::kodo_workers:(count(job_point_bytes_total ), count(write_byte_total )) BY guance_site |