自定义监控 #
一、自定义监控能干什么 #
1.1 功能说明 #
MSP自定义监控功能,提供了基于服务粒度的,自定义时序监控的能力。
这里对其中的关键词做补充说明:
- 服务粒度:即提供的监控功服务于单个服务(以unique_id区分)。各服务之间的监控相互独立,且应根据自身服务特点,设定不同的监控。
- 自定义:即提供接入方自行控制的监控指标。如:订单团队可以发送下单量相关的监控数据、用户团队可以发送注册用户数量相关的监控,针对自身服务特点和关键的业务指标、性能指标做监控。
- 时序监控:即发送的数据带有“时序”特征。每次发送的指标代表了发送时刻的数值,这样我们就可以构建出基于时间范围的指标数据,用以分析指标的趋势或特征。
1.2 使用场景参考 #
接下来列出几种自定义监控可以应用的经典场景,让我们看看自定义监控可以发挥的能量。
1.2.1 场景一:监控商城的每分钟订单量 #
系统的运行除了关注基础的系统指标(如内存指标、CPU指标)外,我们还要关注其业务指标。对于一个正常的,运行稳定的系统,其对外表现的整体业务特征应具有规律性。
如,正常情况下,一个运行正常的商城订单服务,其订单量应该在一个稳定的区间内波动。订单量可以作为此服务稳定性的一个关键业务指标。
当下单量出现剧烈波动时,我们需要提高警惕,如:订单量激增时,是否是营销团队正在做促销,还是被羊毛党薅羊毛导致。订单量突降时,是发布了新版本导致功能异常,还是依赖的第三方服务异常导致。
基于上述可能的情况,为了保障业务的稳定性,提高我们队系统的信心,我们需要对订单量进行监控。
伪代码样例
// 我们 MSP 建立一个发送KEY new_order,用来表示发送时刻新增的订单量
function newOrder(){
// 处理新增订单逻辑时,发送数据至 MSP
$metrics->sendSimpleMetrics('new_order', 1);
}
绘制出时序图像样例

通过对订单量的监控,MSP可以自动绘制出类似上述表示的监控图形,提升业务系统的可观测性,在下述场景中发挥巨大价值:
- 发布新功能时,观测是否对系统稳定性造成影响
- 进行营销活动时,评估活动价值
- 基于指标进行自动化策略预警,进行自动化值班建设
- 用户行为画像建设
- 其他更多场景
1.2.2 场景二:分析业务中关键函数的处理时间 #
自定义监控功能除了应用在业务领域之外,还可以应用在服务治理角度。
建设我们的系统中有个同步高延时处理(可能是个大文件处理,亦或是依赖了某第三方服务),为了对此处理进行更好的观测,我们可以将其处理时间进行监控。
伪代码样例
// 我们 MSP 建立一个发送KEY func1_time_usage,用来表示函数 func1 的耗时
function func1(){
// 函数开始地方获取当前时间戳
$startTimestamp = ....
// ... 在函数结束的地方计算当前函数耗时
$metrics->sendSimpleMetrics('func1_time_usage', $endTimestamp - $startTimestamp);
}
绘制出时序图像样例

通过对关键函数的监控,可以提供对服务治理相关的决策指标。同时也能作为部分问题的排障依据。
二、如何接入 #
MSP自定义监控的接入主要分两步:
- 第一步:在 MSP 平台配置发送的 KEY 和图表属性
- 第二步:使用 SDK 进行数据发送
2.1 在 MSP 平台配置发送的 KEY 和图表属性 #
功能入口:「服务治理详情」- 「自定义监控」

根据要求,填写自己的KEY和相关说明。注意KEY的格式:使用字母或下划线

2.2 使用 SDK 进行发送 #
目前提供 PHP 和 Go 语言的 SDK,可直接使用。
PHP SDK 示例
<?php
use Metrics\Metrics;
use Metrics\MetricsConst;
use Metrics\MetricsData;
$metrics = new Metrics();
// 调用示例1: 发送数据,值为 100,不包含 tag
$result = $metrics->sendSimpleMetrics('testService', 100);
// 调用示例2:发送数据,值为 100,包含 tag,tag 值为 v1,v2...
$result = $metrics->sendSimpleMetrics('testService', 100, ['tag1'=>'v1', 'tag2'=>'v2']);
Go SDK 示例
package main
import (
"gitlab.oneitfarm.com/bifrost/metrics-go/client"
"gitlab.oneitfarm.com/bifrost/metrics-go/metrics"
"log"
"time"
)
func main() {
conf := client.HTTPConfig{
Addr: "http://localhost:8080/sidecar/metrics",
Timeout: time.Second,
MaxIdleConns: 30,
MaxIdleConnsPerHost: 30,
IdleConnTimeout: time.Second * 30,
}
metricsClient, err := client.NewHttpClient(conf)
if err != nil {
log.Println(err)
return
}
// 调用示例1: 发送数据,值为 100,不包含 tag
res, err := metricsClient.SendSimpleMetrics("testService", 100, nil)
// 调用示例2:发送数据,值为 100,包含 tag,tag 值为 v1,v2...
res, err := metricsClient.SendSimpleMetrics("testService", 100, map[string]string{"tag1":"v1", "tag2":"v2"})
}
2.3 数据发送后,MSP自动绘制图像 #

对于默认的图像,可以更改默认展现形式

我们可以修改图表的数据源、标题、单位、图表类型等
