自定义监控

自定义监控 #

一、自定义监控能干什么 #

1.1 功能说明 #

MSP自定义监控功能,提供了基于服务粒度的,自定义时序监控的能力。

这里对其中的关键词做补充说明:

  • 服务粒度即提供的监控功服务于单个服务(以unique_id区分)。各服务之间的监控相互独立,且应根据自身服务特点,设定不同的监控。
  • 自定义即提供接入方自行控制的监控指标。如:订单团队可以发送下单量相关的监控数据、用户团队可以发送注册用户数量相关的监控,针对自身服务特点和关键的业务指标、性能指标做监控。
  • 时序监控即发送的数据带有“时序”特征。每次发送的指标代表了发送时刻的数值,这样我们就可以构建出基于时间范围的指标数据,用以分析指标的趋势或特征。

1.2 使用场景参考 #

接下来列出几种自定义监控可以应用的经典场景,让我们看看自定义监控可以发挥的能量。

1.2.1 场景一:监控商城的每分钟订单量 #

系统的运行除了关注基础的系统指标(如内存指标、CPU指标)外,我们还要关注其业务指标。对于一个正常的,运行稳定的系统,其对外表现的整体业务特征应具有规律性。

如,正常情况下,一个运行正常的商城订单服务,其订单量应该在一个稳定的区间内波动。订单量可以作为此服务稳定性的一个关键业务指标。

当下单量出现剧烈波动时,我们需要提高警惕,如:订单量激增时,是否是营销团队正在做促销,还是被羊毛党薅羊毛导致。订单量突降时,是发布了新版本导致功能异常,还是依赖的第三方服务异常导致。

基于上述可能的情况,为了保障业务的稳定性,提高我们队系统的信心,我们需要对订单量进行监控。

伪代码样例

// 我们 MSP 建立一个发送KEY new_order,用来表示发送时刻新增的订单量

function newOrder(){
  // 处理新增订单逻辑时,发送数据至 MSP
  $metrics->sendSimpleMetrics('new_order', 1);
}

绘制出时序图像样例

image-20210207135605775

通过对订单量的监控,MSP可以自动绘制出类似上述表示的监控图形,提升业务系统的可观测性,在下述场景中发挥巨大价值:

  • 发布新功能时,观测是否对系统稳定性造成影响
  • 进行营销活动时,评估活动价值
  • 基于指标进行自动化策略预警,进行自动化值班建设
  • 用户行为画像建设
  • 其他更多场景

1.2.2 场景二:分析业务中关键函数的处理时间 #

自定义监控功能除了应用在业务领域之外,还可以应用在服务治理角度。

建设我们的系统中有个同步高延时处理(可能是个大文件处理,亦或是依赖了某第三方服务),为了对此处理进行更好的观测,我们可以将其处理时间进行监控。

伪代码样例

// 我们 MSP 建立一个发送KEY func1_time_usage,用来表示函数 func1 的耗时
function func1(){
  // 函数开始地方获取当前时间戳
  $startTimestamp = ....
  
  // ... 在函数结束的地方计算当前函数耗时

  $metrics->sendSimpleMetrics('func1_time_usage', $endTimestamp - $startTimestamp);
}

绘制出时序图像样例

image-20210207140446528

通过对关键函数的监控,可以提供对服务治理相关的决策指标。同时也能作为部分问题的排障依据。

二、如何接入 #

MSP自定义监控的接入主要分两步:

  • 第一步:在 MSP 平台配置发送的 KEY 和图表属性
  • 第二步:使用 SDK 进行数据发送

2.1 在 MSP 平台配置发送的 KEY 和图表属性 #

功能入口:「服务治理详情」- 「自定义监控」

image-20210207143135428

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

image-20210207143234535

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自动绘制图像 #

image-20210207143715400

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

image-20210207143906195

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

image-20210207143937647