日志服务 SLS – 基础模型能力
功能介绍
在智能运维这个场景中,SLS 针对 Log、Metric、Trace 这三类基础数据的特点,以及围绕这三类数据的高频场景进行建模
- 时序预测
- 时序异常检测
- 时序片段异常形态分类
- 文本数据中的实体识别(NER)
- Trace 调用链中的高延时 Span 识别
并对这些模型服务化,供客户可以远程调用。跟自己的业务系统进行 API 维度的能力集成。
Metric 模型能力
在提供的数据中,可以使用如下 SQL,提取相关的指标数据,当数据点数据量大于 100 个点时就可以主动触发该序列的异常检测。
* and endpoint: "cn-chengdu.192.168.11.202" | select __time__ - __time__ % 60 as time, sum(flow) as flow_sum from log group by time order by time limit 10000
时序指标异常检测
LogNER 模型能力
样例日志一:
{
"source":"Hadoop",
"content":"Address change detected. Old: msra-sa-41/10.190.173.170:8030 New: msra-sa-41:8030",
}
标准软件库 NER
样例日志二:
{
"source":"hibernate-orm",
"content":"Unable to resolve connection default schema IOException"
}
标准软件库 NER
功能优势
- 在机器数据领域收集并整理了大量的真实数据,进行建模
- 相关模型在日志领域可以做到开箱即用,无需特别多的启动数据
- 在平台上提供了基础的 API 能力,客户在在自己的业务场景中进行集成
核心价值
- 智能异常分析应用围绕运维场景中的监控指标、程序日志、服务关系等核心要素展开,通过机器学习等手段产生异常事件,通过服务拓扑关联分析时序数据和事件,最终降低企业的运维复杂度,提高服务质量。
通过 OpenAPI 使用基础模型
- 安装所依赖的软件包
pip install alibabacloud_sls20201230==4.1.0
- 账号所需要的权限
{
"Version": "1",
"Statement": [
{
"Action": [
"log:Get*"
],
"Resource": [
"acs:log:*:*:/ml/service/sls_builtin_service_metric_anomaly/",
"acs:log:*:*:/ml/service/sls_builtin_service_log_struct/",
"acs:log:*:*:/ml/service/sls_builtin_service_trace_rca/",
"acs:log:*:*:/ml/service/sls_builtin_service_series_prediction/"
],
"Effect": "Allow"
}
]
}
还有一种更佳精简的配置方法,具体如下
{
"Version": "1",
"Statement": [
{
"Action": [
"log:Get*"
],
"Resource": [
"acs:log:*:*:/ml/service/sls_builtin_service_*",
"acs:log:*:*:/ml/service/sls_builtin_service_*/*"
],
"Effect": "Allow"
}
]
}
1. 日志数据中的实体识别
服务名称
sls_builtin_service_log_struct
请求参数
body.parameter
{
"is_struct": "true",
"use_gpu": "true/false",
"max_fields": "1"
}
- is_struct 为 true 时,表示日志格式为 json 结构。目前只支持设置为 true
- use_gpu 表示是否使用 gpu 资源
- max_fields 表示当日志格式为 json 结构时,最多分析其中的几个字段,默认只分析一个字段
body.input
[
{
"{column_name}": "{column_value}"
}
]
输入的内容是一个是 json 结构数组,其中
- column_name 表示 json 结构的日志的某个字段名称
- column_value 表示 json 结构的日志的某个字段的值
返回参数
data
[
{
"{column_name}": "{column_value}"
}
]
输出内容中每一个 json 结构与输入的 json 结构日志一一对应,其中
- column_name 表示 json 结构的日志的被分析了的某个字段名称,最多有 max_fields 个字段被分析
- columnvalue 表示 json 结构的日志的被分析了的某个字段的值,字段值中的 NER 结果被标签 <ml_ner${ner_type}></ml_ner_${ner_type}> 包裹,其中 ${ner_type} 是具体的 NER 类型
使用示例(Python)
import traceback
from alibabacloud_sls20201230.client import Client as Sls20201230Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_sls20201230 import models as sls_20201230_models
from alibabacloud_tea_util import models as util_models
from alibabacloud_tea_util.client import Client as UtilClient
config = open_api_models.Config(
# 必填,您的 AccessKey ID,
access_key_id=access_key_id,
# 必填,您的 AccessKey Secret,
access_key_secret=access_key_secret,
read_timeout=60*1000,
connect_timeout=60*1000,
# Endpoint 请参考 https://api.aliyun.com/product/Sls
endpoint = "cn-shanghai.log.aliyuncs.com"
)
client = Sls20201230Client(config)
param = sls_20201230_models.MLServiceAnalysisParam()
param.parameter = {
"is_structed": "true", # 目前必须设置为 "true"
"use_gpu": "true",
"max_fields": "2"
}
# 设置待分析的日志列表,每一条日志为 dict 格式
param.input = [
{
"column_name_1": 'column_value_1',
"column_name_2": 'column_value_2'
},
{
"column_name_1": 'column_value_1',
"column_name_2": 'column_value_2'
}
]
request = sls_20201230_models.GetMLServiceResultsRequest()
request.allow_builtin = "true"
request.body = param
runtime = util_models.RuntimeOptions()
headers = {}
try:
service_name = "sls_builtin_service_log_struct"
resp = client.get_mlservice_results_with_options(service_name, request, headers, runtime)
if resp.status_code == 200:
print(resp.body)
except Exception as error:
print(traceback.format_exc())
UtilClient.assert_as_string(error.message)
2. 时序数据的异常检测
服务名称
sls_builtin_service_metric_anomaly
请求参数
body.parameter
{
"isOrdered": "true/false",
"keys": "[]",
"timeColumnName": "",
"analysisColumnNames": "[]",
"interval": "-1"
}
- isOrdered 表示输入的数据是否是有序的,如果输入的序列是按照时间维度从小到大,升序排列的,设置为 true,否则设置为 false
- interval 表示时间序列的间隔大小,按照秒来描述。比如:序列是每分钟一个点,则设置为 60;如果不确定序列的间隔,则设置为 -1
- timeColumnName 表示输入的序列中,时间维度的名称
- analysisColumnNames 表示输入的序列中,带分析的数值特征维度的名称,使用数组来表示,且需要将这个数组序列化成字符串
- keys 表示输入的数据的各列的名称,使用数组表示,且需要将这个数组序列化成字符串
body.input
[
{
"{column_name}": "{column_value}"
}
]
输入的内容是一个是数组,其中
- column_name 表示序列中某个字段的名称
- column_value 表示序列中某个字段的值的内容。当 {column_name} 等于 {timeColumnName} 时,对应的值表示的是时间大小,使用 unixtime 时间戳来表示,单位是秒
几个限制说明
- 输入的序列长度,需要在 [100, 10000] 个点
返回参数
data
[
{
"start": "",
"end": "",
"label": ""
}
]
- start 表示检测出来的异常区间的开始时间
- end 表示检测出来的异常区间的结束时间
- label 表示检测出来的当前区间的异常类型
- SPIKE_UP_TYPE
- SPIKE_DOWN_TYPE
- TREND_UP_TYPE
- TREND_DOWN_TYPE
- MEANSHIFT_UPWARD_TYPE
- MEANSHIFT_DOWNWARD_TYPE
使用示例(Python)
# -*- coding: utf-8 -*-
# This file is auto-generated, don't edit it. Thanks.
import sys
import json
import time
import numpy as np
from typing import List
from alibabacloud_sls20201230.client import Client as Sls20201230Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_sls20201230 import models as sls_20201230_models
from alibabacloud_tea_util import models as util_models
from alibabacloud_tea_util.client import Client as UtilClient
class Sample:
def __init__(self):
pass
@staticmethod
def create_client(
access_key_id: str,
access_key_secret: str,
) -> Sls20201230Client:
"""
使用AK&SK初始化账号Client
@param access_key_id:
@param access_key_secret:
@return: Client
@throws Exception
"""
config = open_api_models.Config(
# 必填,您的 AccessKey ID,
access_key_id=access_key_id,
# 必填,您的 AccessKey Secret,
access_key_secret=access_key_secret,
read_timeout=60*1000,
connect_timeout=60*1000,
)
# Endpoint 请参考 https://api.aliyun.com/product/Sls
config.endpoint = "cn-shanghai.log.aliyuncs.com"
return Sls20201230Client(config)
@staticmethod
def make_ml_service_analysis_param() -> sls_20201230_models.MLServiceAnalysisParam:
ml_service_analysis_param = sls_20201230_models.MLServiceAnalysisParam()
time_name = "time"
feat_names = ["num"]
interval = 60
ml_service_analysis_param.parameter = {
"isOrdered": "true",
"keys": json.dumps(feat_names + [time_name]),
"timeColumnName": time_name,
"analysisColumnNames": json.dumps(feat_names),
"interval": f"{interval}"
}
n_size = 1440
e = time.time() // interval * interval
s = e - n_size * interval
ts = []
for i in range(n_size):
ts.append(s + i * interval)
n_fs = len(feat_names)
ds = np.random.random((n_size, n_fs))
inputs = []
for i in range(0, n_size):
tmp_dict = {}
tmp_dict[time_name] = str(int(ts[i]))
for k, c in enumerate(feat_names):
tmp_dict[c] = str(ds[i][k])
inputs.append(tmp_dict)
ml_service_analysis_param.input = inputs
return ml_service_analysis_param
@staticmethod
def main(
args: List[str],
) -> None:
# 请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
# 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例使用环境变量获取 AccessKey 的方式进行调用,仅供参考,建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378659.html
ALIBABA_CLOUD_ACCESS_KEY_ID = ""
ALIBABA_CLOUD_ACCESS_KEY_SECRET = ""
client = Sample.create_client(ALIBABA_CLOUD_ACCESS_KEY_ID, ALIBABA_CLOUD_ACCESS_KEY_SECRET)
get_mlservice_results_request = sls_20201230_models.GetMLServiceResultsRequest()
get_mlservice_results_request.allow_builtin = "true"
get_mlservice_results_request.body = Sample.make_ml_service_analysis_param()
runtime = util_models.RuntimeOptions()
headers = {}
try:
# 复制代码运行请自行打印 API 的返回值
service_name = "sls_builtin_service_metric_anomaly"
resp = client.get_mlservice_results_with_options(service_name, get_mlservice_results_request, headers, runtime)
if resp.status_code == 200:
print(resp.body)
except Exception as error:
# 错误 message
print(error.message)
UtilClient.assert_as_string(error.message)
if __name__ == '__main__':
for i in range(0, 50):
Sample.main(sys.argv[1:])
time.sleep(1)
3. 高延时 Trace 根因分析
服务名称
sls_builtin_service_trace_rca
请求参数
body.parameter
{
"project": "",
"logstore": "",
"endpoint": "",
"role_arn": ""
}
- project 表示待分析的 Trace 数据存储在 SLS 中的 Project 的名称
- logstore 表示待分析的 Trace 数据存储在 SLS 中的 Logstore 的名称
- endpoint 表示 project 所在地域的 endpoint 信息,这里必须使用公网域名,内网域名无法访问
- role_arn 表示已经对该资源进行授权的角色信息,这里务必使用 ETLRole 或者 AuditRole 的 arn 信息
body.input
[
{
"service": "",
"name": "",
"from_ts_sec": "",
"to_ts_sec": "",
"slo_ts_micro": "",
"batch_id": "",
"trace_ids": "[]"
}
]
输入的内容是一个是数组,切输入的数组的长度是 1,其中对应的参数的含义解释如下:
- service 表示某个或者某一批待诊断的 TraceID 的服务名称,可以从 logstore 中获得
- name 表示某个或者某一批待诊断的 TraceID 的服务名称,可以从 logstore 中获得
- from_ts_sec 表示待分析的开始时间戳,单位是秒
- to_ts_sec 表示待分析的结束时间戳,单位是秒
- batch_id 表示当前待分析的一批 TraceID 的名称
- trace_ids 表示当前请求中对应的 trace_id 的列表,使用 json 序列化成字符串
返回参数
data
[
{
"traceID": "",
"service": "",
"name": "",
"rootCauses": "[{}]"
}
]
- traceID 表示待检测的 traceID 信息
- service 表示当前这个 Trace 的根节点的 service 名称
- name 表示当前这个 Trace 的根节点的 name 名称
- rootCauses 表示当前这个高延时请求的 Trace 中,导致高延时的 span 的列表信息,使用序列化后的字符串来表示。该字段的值反序列化后的结构如下:
[
{
"spanID": "",
"service": "",
"name": "",
"host": "xxxx",
"predicateDuration": 10
}
]
使用示例(Python)
# -*- coding: utf-8 -*-
# This file is auto-generated, don't edit it. Thanks.
import sys
import json
import time
import numpy as np
from typing import List
from alibabacloud_sls20201230.client import Client as Sls20201230Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_sls20201230 import models as sls_20201230_models
from alibabacloud_tea_util import models as util_models
from alibabacloud_tea_util.client import Client as UtilClient
class Sample:
def __init__(self):
pass
@staticmethod
def create_client(
access_key_id: str,
access_key_secret: str,
) -> Sls20201230Client:
"""
使用AK&SK初始化账号Client
@param access_key_id:
@param access_key_secret:
@return: Client
@throws Exception
"""
config = open_api_models.Config(
# 必填,您的 AccessKey ID,
access_key_id=access_key_id,
# 必填,您的 AccessKey Secret,
access_key_secret=access_key_secret,
read_timeout=60*1000,
connect_timeout=60*1000,
)
# Endpoint 请参考 https://api.aliyun.com/product/Sls
config.endpoint = "cn-shanghai.log.aliyuncs.com"
return Sls20201230Client(config)
@staticmethod
def make_ml_service_analysis_param() -> sls_20201230_models.MLServiceAnalysisParam:
ml_service_analysis_param = sls_20201230_models.MLServiceAnalysisParam()
ml_service_analysis_param.parameter = {
"project": "{project_name}",
"logstore": "{logstore_name}",
"endpoint": "{project 所在的公网endpoint}",
"role_arn": "acs:ram::{main_account_aliuid}:role/aliyunlogetlrole"
}
ml_service_analysis_param.input = [
{
"service": "front-end",
"name": "POST /orders",
"from_ts_sec": "1701928980",
"to_ts_sec": "1701929880",
"slo_ts_micro": "254",
"batch_id": "test_batch_id",
"trace_ids": "[\"eca23b71032eb40149864975668f06c9\"]"
}
]
return ml_service_analysis_param
@staticmethod
def main(
args: List[str],
) -> None:
# 请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
# 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例使用环境变量获取 AccessKey 的方式进行调用,仅供参考,建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378659.html
ALIBABA_CLOUD_ACCESS_KEY_ID = ""
ALIBABA_CLOUD_ACCESS_KEY_SECRET = ""
client = Sample.create_client(ALIBABA_CLOUD_ACCESS_KEY_ID, ALIBABA_CLOUD_ACCESS_KEY_SECRET)
get_mlservice_results_request = sls_20201230_models.GetMLServiceResultsRequest()
get_mlservice_results_request.allow_builtin = "true"
get_mlservice_results_request.body = Sample.make_ml_service_analysis_param()
runtime = util_models.RuntimeOptions()
headers = {}
try:
# 复制代码运行请自行打印 API 的返回值
service_name = "sls_builtin_service_trace_rca"
resp = client.get_mlservice_results_with_options(service_name, get_mlservice_results_request, headers, runtime)
if resp.status_code == 200:
print(resp.body)
except Exception as error:
# 错误 message
print(error.message)
UtilClient.assert_as_string(error.message)
if __name__ == '__main__':
Sample.main(sys.argv[1:])
4. 时序预测方法
服务名称
sls_builtin_service_series_prediction
请求参数
body.parameter
{
"time_name": "time",
"feature_names": "[\"flow\"]",
"pred_config": "{
\"periods\": 720,
\"freq\": \"min\"
}"
}
- time_name 表示 input 的每个数据中时间字段的名称
- feature_names 表示 input 的每个数据中的指标字段的名称
- pred_config 表示要预测多长时间的序列,其中 periods 表示要预测多少个点,freq 表示每一个点的时间单位,可选时间单位如下
- hour 表示小时
- min 表示分钟
- s 表示秒
- day 表示天
body.input
[
{
"{column_name}": "{column_value}"
}
]
输入的内容是一个是 json 结构数组,其中包含一个时间字段(由 parameter.time_name 指定)和若干个指标字段(由 parameter.feature_names 指定)。 其中时间字段的值必须可以转换成整数类型,以秒为单位;指标字段的值必须可以转换成数值类型。
具体的一个例子如下:
[
{
"flow": "670",
"time": "1705998420"
},
{
"flow": "499",
"time": "1705998480"
},
...
]
返回参数
data
[
{
"flow_hat": "733.412776",
"flow_upper": "924.663573873938",
"time": "1705973340",
"flow_lower": "573.3463870005102"
},
{
"flow_hat": "728.8411423109048",
"flow_upper": "899.7568154110494",
"time": "1705973400",
"flow_lower": "560.4061980744253"
},
...
]
输出内容中每一个 json 结构表示对于每一个时间时刻的预测结果
- ${time_name} 表示 json 结构对应的时刻,以秒为单位
- ${feature_name}_hat 表示对应时刻的预测值
- ${feature_name}_upper 表示对应时刻的预测值的上界
- ${feature_name}_lower 表示对应时刻的预测值的下界
status
{
"flow_mse": "5084.058",
"flow_r2": "0.5278"
}
包含对于每一个指标的历史数据的拟合程度
- ${feature_name}_mse 表示拟合对应指标历史数据的均方误差。误差越小,表示预测值对于历史数据的拟合程度越好
- ${feature_name}_r2 表示拟合对应指标历史数据的 r2 分数。分数越高,表示预测值对于历史数据的拟合程度
使用示例(Python)
import traceback
from alibabacloud_sls20201230.client import Client as Sls20201230Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_sls20201230 import models as sls_20201230_models
from alibabacloud_tea_util import models as util_models
from alibabacloud_tea_util.client import Client as UtilClient
config = open_api_models.Config(
# 必填,您的 AccessKey ID,
access_key_id=access_key_id,
# 必填,您的 AccessKey Secret,
access_key_secret=access_key_secret,
read_timeout=60*1000,
connect_timeout=60*1000,
# Endpoint 请参考 https://api.aliyun.com/product/Sls
endpoint = "cn-shanghai.log.aliyuncs.com"
)
client = Sls20201230Client(config)
param = sls_20201230_models.MLServiceAnalysisParam()
param.parameter = {
"time_name": "time", # input 中的时间字段
"feature_names": "[\"flow\"]", # input 中的指标字段
"pred_config": "{\"periods\": 720, \"freq\": \"min\"}" # 需要预测多长时间的序列,包括时序点的数量和时序点的单位
}
# 设置待预测的时间序列,每一个 json 结构包含一个时序点对应的时间和指标值
param.input = [
{"flow": "632", "time": "1705973340"},
{"flow": "679", "time": "1705973400"},
{"flow": "534", "time": "1705973460"},
{"flow": "615", "time": "1705973520"},
{"flow": "675", "time": "1705973580"},
{"flow": "764", "time": "1705973640"},
{"flow": "556", "time": "1705973700"},
{"flow": "505", "time": "1705973760"},
{"flow": "780", "time": "1705973820"},
{"flow": "579", "time": "1705973880"}
]
request = sls_20201230_models.GetMLServiceResultsRequest()
request.allow_builtin = "true"
request.body = param
runtime = util_models.RuntimeOptions()
headers = {}
try:
service_name = "sls_builtin_service_series_prediction"
resp = client.get_mlservice_results_with_options(service_name, request, headers, runtime)
if resp.status_code == 200:
print(resp.body)
except Exception as error:
print(traceback.format_exc())
UtilClient.assert_as_string(error.message)