Files
2025-11-27 11:01:26 +08:00

2139 lines
66 KiB
Python

# coding=utf-8
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import re
from typing import List, Dict
from volcengine.tls.const import *
def pascal_to_snake(pascal: str) -> str:
return re.sub(r"(?P<key>[A-Z])", r"_\g<key>", pascal).lower().strip('_')
def snake_to_pascal(snake: str) -> str:
return ''.join(word.title() for word in snake.split('_'))
class TLSData:
@classmethod
def set_attributes(cls, data: dict):
if data is None or len(data) == 0:
return None
tls_data_dict = {}
for key in data.keys():
tls_data_dict[pascal_to_snake(key)] = data[key]
tls_data = cls()
for key in tls_data.__dict__.keys():
tls_data.__dict__[key] = None
tls_data.__dict__.update(tls_data_dict)
return tls_data
def json(self):
json_data = {}
for key in self.__dict__.keys():
if self.__dict__[key] is not None:
json_data[snake_to_pascal(key)] = self.__dict__[key]
return json_data
class TagInfo(TLSData):
def __init__(self, key: str, value: str = None):
"""
:param key: 标签Key的值
:param value: 标签Value的值
"""
self.key = key
self.value = value
class ProjectInfo(TLSData):
def __init__(self, project_name: str = None, project_id: str = None, description: str = None,
create_time: str = None, inner_net_domain: str = None, topic_count: int = None,
iam_project_name: str = None, tags: List[TagInfo] = None):
self.project_name = project_name
self.project_id = project_id
self.description = description
self.create_time = create_time
self.inner_net_domain = inner_net_domain
self.topic_count = topic_count
self.iam_project_name = iam_project_name
self.tags = tags
@classmethod
def set_attributes(cls, data: dict):
project_info = super(ProjectInfo, cls).set_attributes(data)
if TAGS in data:
tags = data[TAGS]
project_info.tags = []
for i in range(len(tags)):
project_info.tags.append(TagInfo(tags[i].get(KEY), tags[i].get(VALUE)))
return project_info
def get_inner_net_domain(self):
"""
:return:内网连接域名
:rtype:str
"""
return self.inner_net_domain
def get_create_time(self):
"""
:return: 创建时间
:rtype: str
"""
return self.create_time
def get_project_id(self):
"""
:return: 日志项目 ID
:rtype: str
"""
return self.project_id
def get_description(self):
"""
:return:日志项目描述
:rtype: str
"""
return self.description
def get_project_name(self):
"""
:return:日志项目名称
:rtype:str
"""
return self.project_name
def get_topic_count(self):
"""
:return:日志项目下的日志主题数量
:rtype:int
"""
return self.topic_count
def get_iam_project_name(self):
"""
:return: 日志项目所属的IAM项目
:rtype: str
"""
return self.iam_project_name
def get_tags(self):
"""
:return: 日志项目标签信息
:rtype: List[TagInfo]
"""
return self.tags
class TopicInfo(TLSData):
def __init__(self, topic_name: str = None, topic_id: str = None, project_id: str = None, ttl: int = None,
create_time: str = None, modify_time: str = None, shard_count: int = None, description: str = None,
auto_split: bool = None, max_split_shard: int = None, enable_tracking: bool = None,
time_key: str = None, time_format: str = None, tags: List[TagInfo] = None, log_public_ip: bool = None,
enable_hot_ttl: bool = None, hot_ttl: int = None, cold_ttl: int = None, archive_ttl: int = None):
self.topic_name = topic_name
self.topic_id = topic_id
self.project_id = project_id
self.ttl = ttl
self.create_time = create_time
self.modify_time = modify_time
self.shard_count = shard_count
self.description = description
self.auto_split = auto_split
self.max_split_shard = max_split_shard
self.enable_tracking = enable_tracking
self.time_key = time_key
self.time_format = time_format
self.tags = tags
self.log_public_ip = log_public_ip
self.enable_hot_ttl = enable_hot_ttl
self.hot_ttl = hot_ttl
self.cold_ttl = cold_ttl
self.archive_ttl = archive_ttl
@classmethod
def set_attributes(cls, data: dict):
topic_name = data.get(TOPIC_NAME)
topic_id = data.get(TOPIC_ID)
project_id = data.get(PROJECT_ID)
ttl = data.get(TTL)
create_time = data.get(CREATE_TIME)
modify_time = data.get(MODIFY_TIME)
shard_count = data.get(SHARD_COUNT)
description = data.get(DESCRIPTION)
auto_split = data.get(AUTO_SPLIT)
max_split_shard = data.get(MAX_SPLIT_SHARD)
enable_tracking = data.get(ENABLE_TRACKING)
time_key = data.get(TIME_KEY)
time_format = data.get(TIME_FORMAT)
topic_tags = None
log_public_ip = data.get(LOG_PUBLIC_IP)
enable_hot_ttl = data.get(ENABLE_HOT_TTL)
hot_ttl = data.get(HOT_TTL)
cold_ttl = data.get(COLD_TTL)
archive_ttl = data.get(ARCHIVE_TTL)
tags = data.get(TAGS)
if tags is not None:
topic_tags = []
for i in range(len(tags)):
topic_tags.append(TagInfo(tags[i].get(KEY), tags[i].get(VALUE)))
return cls(topic_name, topic_id, project_id, ttl, create_time, modify_time, shard_count, description,
auto_split, max_split_shard, enable_tracking, time_key, time_format, topic_tags, log_public_ip,
enable_hot_ttl, hot_ttl, cold_ttl, archive_ttl)
def get_create_time(self):
"""
:return: 创建时间
:rtype: str
"""
return self.create_time
def get_project_id(self):
"""
:return: 日志项目 ID
:rtype: str
"""
return self.project_id
def get_modify_time(self):
"""
:return:修改时间
:rtype: str
"""
return self.modify_time
def get_shard_count(self):
"""
:return:日志分区的数量
:rtype: int
"""
return self.shard_count
def get_topic_name(self):
"""
:return: 日志主题名称
:rtype: str
"""
return self.topic_name
def get_description(self):
"""
:return:日志主题描述
:rtype: str
"""
return self.description
def get_topic_id(self):
"""
:return: 日志主题 ID
:rtype: str
"""
return self.topic_id
def get_ttl(self):
"""
:return: 日志在日志服务中的保存时间, 单位天
:rtype: int
"""
return self.ttl
def is_auto_split(self):
"""
:return: 是否开启分区的自动分裂功能
:rtype: bool
"""
return self.auto_split
def get_max_split_shard(self):
"""
:return: 分区的最大分裂数
:rtype: int
"""
return self.max_split_shard
def is_enable_tracking(self):
"""
:return: 是否开启了WebTracking功能
:rtype: bool
"""
return self.enable_tracking
def get_time_key(self):
"""
:return: 日志时间字段的字段名称
:rtype: str
"""
return self.time_key
def get_time_format(self):
"""
:return: 时间字段的解析格式
:rtype: str
"""
return self.time_format
def get_tags(self):
"""
:return: 日志主题标签信息
:rtype: List[TagInfo]
"""
return self.tags
def get_log_public_ip(self):
"""
:return: 是否开启了记录外网IP功能
:rtype: bool
"""
return self.log_public_ip
class FullTextInfo(TLSData):
def __init__(self, case_sensitive: bool = None, delimiter: str = None, include_chinese: bool = False):
"""
:param case_sensitive: 是否大小写敏感
:type case_sensitive:bool
:param delimiter:全文索引的分词符
:type delimiter:string
:param include_chinese:是否包含中文
:type include_chinese:bool
"""
self.case_sensitive = case_sensitive
self.delimiter = delimiter
self.include_chinese = include_chinese
def get_delimiter(self):
"""
:return: 全文索引的分词符
:rtype: string
"""
return self.delimiter
def get_case_sensitive(self):
"""
:return: 是否大小写敏感
:rtype: bool
"""
return self.case_sensitive
def get_include_chinese(self):
"""
:return:是否包含中文
:rtype: bool
"""
return self.include_chinese
@classmethod
def set_attributes(cls, data: dict):
case_sensitive = data.get(CASE_SENSITIVE)
delimiter = data.get(DELIMITER)
include_chinese = data.get(INCLUDE_CHINESE)
return cls(case_sensitive, delimiter, include_chinese)
class ValueInfo(TLSData):
def __init__(self, value_type: str, delimiter: str = None, case_sensitive: bool = False,
include_chinese: bool = False, sql_flag: bool = False, index_all: bool = False, json_keys = None):
self.value_type = value_type
self.delimiter = delimiter
self.case_sensitive = case_sensitive
self.include_chinese = include_chinese
self.sql_flag = sql_flag
self.index_all = index_all
if value_type == "json":
self.json_keys = json_keys
else:
self.json_keys = None
@classmethod
def set_attributes(cls, data: dict):
value_type = data.get(VALUE_TYPE)
delimiter = data.get(DELIMITER)
case_sensitive = data.get(CASE_SENSITIVE)
include_chinese = data.get(INCLUDE_CHINESE)
sql_flag = data.get(SQL_FLAG)
index_all = data.get(INDEX_ALL)
json_keys = data.get(JSON_KEYS)
return cls(value_type, delimiter, case_sensitive, include_chinese, sql_flag, index_all, json_keys)
class KeyValueInfo(TLSData):
def __init__(self, key: str, value: ValueInfo):
"""
:param key:需要配置键值索引的字段名称
:type key:string
:param value:需要配置键值索引的字段描述信息
:type value:string
"""
self.key = key
self.value = value
def json(self):
return {KEY: self.key, VALUE: self.value.json()}
class AnalysisResult(TLSData):
def __init__(self, analysis_schema: List[str] = None, analysis_type: dict = None, analysis_data: List[dict] = None):
self.analysis_schema = analysis_schema
self.analysis_type = analysis_type
self.analysis_data = analysis_data
def get_analysis_schema(self):
"""
:return:日志分析列的名称
:rtype:List[str]
"""
return self.analysis_schema
def get_analysis_type(self):
"""
:return:日志分析列对应的属性
:rtype:dict
"""
return self.analysis_type
def get_analysis_data(self):
"""
:return:分析结果返回的键值对
:rtype:List[dict]
"""
return self.analysis_data
@classmethod
def set_attributes(cls, data: dict):
analysis_schema = data.get(SCHEMA)
analysis_type = data.get(TYPE)
analysis_data = data.get(DATA)
return cls(analysis_schema, analysis_type, analysis_data)
class SearchResult(TLSData):
def __init__(self, result_status: str = None, hit_count: int = None, list_over: bool = None, analysis: bool = None,
count: int = None, limit: int = None, context: str = None, logs: List[dict] = None,
analysis_result: AnalysisResult = None):
self.result_status = result_status
self.hit_count = hit_count
self.list_over = list_over
self.analysis = analysis
self.count = count
self.limit = limit
self.context = context
self.logs = logs
self.analysis_result = analysis_result
def get_list_over(self):
"""
:return: 是否已返回全部结果
:rtype:bool
"""
return self.list_over
def get_analysis_result(self):
"""
:return: 分析结果
:rtype: AnalysisResult
"""
return self.analysis_result
def get_result_status(self):
"""
:return: 查询的状态
:rtype:str
"""
return self.result_status
def get_count(self):
"""
:return: 分析请求命中的条目数
:rtype: int
"""
return self.count
def get_limit(self):
"""
:return:请求中指定返回的 Limit 条目数
:rtype: int
"""
return self.limit
def get_context(self):
"""
:return:仅检索日志时,翻页上下文
:rtype: str
"""
return self.context
def get_hit_count(self):
"""
:return:搜索匹配的总条目数
:rtype: int
"""
return self.hit_count
def get_analysis(self):
"""
:return:是否分析请求
:rtype:bool
"""
return self.analysis
def get_logs(self):
"""
:return:检索日志结果
:rtype: List[dict]
"""
return self.logs
@classmethod
def set_attributes(cls, data: dict):
search_result = super(SearchResult, cls).set_attributes(data)
if ANALYSIS_RESULT in data:
search_result.analysis_result = AnalysisResult.set_attributes(data=data[ANALYSIS_RESULT])
return search_result
class QueryResp(TLSData):
def __init__(self, topic_id: str = None, shard_id: int = None, inclusive_begin_key: str = None,
exclusive_end_key: str = None, status: str = None, modify_time: str = None):
self.topic_id = topic_id
self.shard_id = shard_id
self.inclusive_begin_key = inclusive_begin_key
self.exclusive_end_key = exclusive_end_key
self.status = status
self.modify_time = modify_time
def get_exclusive_end_key(self):
"""
:return:分区结束的 key 值
:rtype:str
"""
return self.exclusive_end_key
def get_inclusive_begin_key(self):
"""
:return:分区起始的 key 值
:rtype:str
"""
return self.inclusive_begin_key
def get_shard_id(self):
"""
:return:日志主题的分区 ID
:rtype: int
"""
return self.shard_id
def get_modify_time(self):
"""
:return:分区修改时间
:rtype:str
"""
return self.modify_time
def get_topic_id(self):
"""
:return:日志主题的 ID
:rtype:str
"""
return self.topic_id
def get_status(self):
"""
:return:分区状态 readwrite:读写,readonly:只读。
:rtype:str
"""
return self.status
class HistogramInfo(TLSData):
def __init__(self, time: int = None, count: int = None):
self.time = time
self.count = count
def get_count(self):
"""
:return:子区间中对应搜索结果的数量
:rtype:int
"""
return self.count
def get_time(self):
"""
:return:子区间的起始时间点,单位为毫秒
:rtype:long
"""
return self.time
class HistogramInfoV1(TLSData):
def __init__(self, count: int = None, start_time: int = None, end_time: int = None, result_status: str = None):
self.count = count
self.start_time = start_time
self.end_time = end_time
self.result_status = result_status
def get_count(self):
"""
:return:子区间中对应搜索结果的数量,即该时段内符合条件的日志条数
:rtype:int
"""
return self.count
def get_start_time(self):
"""
:return:查询的开始时间点,单位为毫秒
:rtype:long
"""
return self.start_time
def get_end_time(self):
"""
:return:查询的开始时间点,单位为毫秒
:rtype:long
"""
return self.end_time
def get_result_status(self):
"""
:return:查询的状态
:rtype:str
"""
return self.result_status
class TaskInfo(TLSData):
def __init__(self, task_id: str = None, task_name: str = None, topic_id: str = None, query: str = None,
start_time: str = None, end_time: str = None, data_format: str = None, task_status: str = None,
compression: str = None, create_time: str = None, log_size: int = None, log_count: int = None):
self.task_id = task_id
self.task_name = task_name
self.topic_id = topic_id
self.query = query
self.start_time = start_time
self.end_time = end_time
self.data_format = data_format
self.task_status = task_status
self.compression = compression
self.create_time = create_time
self.log_size = log_size
self.log_count = log_count
def get_task_name(self):
"""
:return:下载任务的名称
:rtype: str
"""
return self.task_name
def get_start_time(self):
"""
:return:起始时间。格式为 yyyy-MM-dd HH:mm:ss
:rtype: str
"""
return self.start_time
def get_data_format(self):
"""
:return:导出的文件格式,支持 CSV 文件格式或 JSON 格式
:rtype: str
"""
return self.data_format
def get_task_status(self):
"""
:return:下载任务状态
:rtype:str
"""
return self.task_status
def get_log_count(self):
"""
:return:下载的日志条数
:rtype: int
"""
return self.log_count
def get_create_time(self):
"""
:return:下载任务的创建时间
:rtype: str
"""
return self.create_time
def get_query(self):
"""
:return:日志检索分析语句
:rtype:str
"""
return self.query
def get_end_time(self):
"""
:return:结束时间。格式为 yyyy-MM-dd HH:mm:ss
:rtype: str
"""
return self.end_time
def get_task_id(self):
"""
:return:下载任务的 ID
:rtype:str
"""
return self.task_id
def get_log_size(self):
"""
:return:下载的日志量,单位为字节(Byte)
:rtype:long
"""
return self.log_size
def get_topic_id(self):
"""
:return:日志主题名称
:rtype:str
"""
return self.topic_id
def get_compression(self):
"""
:return:导出文件的压缩格式
:rtype:str
"""
return self.compression
class HostInfo(TLSData):
def __init__(self, ip: str = None, log_collector_version: str = None, heartbeat_status: int = None):
self.ip = ip
self.log_collector_version = log_collector_version
self.heartbeat_status = heartbeat_status
def get_ip(self):
"""
:return:机器的 IP 地址
:rtype: str
"""
return self.ip
def get_log_collector_version(self):
"""
:return:机器安装的 LogCollector 的版本
:rtype:str
"""
return self.log_collector_version
def get_heartbeat_status(self):
"""
:return:Agent 的心跳状态。0:心跳正常 1:心跳异常。
:rtype:int
"""
return self.heartbeat_status
class HostGroupInfo(TLSData):
def __init__(self, host_group_id: str = None, host_group_name: str = None, host_group_type: str = None,
host_identifier: str = None, host_count: int = None, normal_heartbeat_status_count: int = None,
abnormal_heartbeat_status_count: int = None, rule_count: int = None,
create_time: str = None, modify_time: str = None, auto_update: bool = False,
update_start_time: str = None, update_end_time: str = None, agent_latest_version: str = None,
service_logging: bool = None, iam_project_name: str = None):
self.host_group_id = host_group_id
self.host_group_name = host_group_name
self.host_group_type = host_group_type
self.host_identifier = host_identifier
self.host_count = host_count
self.normal_heartbeat_status_count = normal_heartbeat_status_count
self.abnormal_heartbeat_status_count = abnormal_heartbeat_status_count
self.rule_count = rule_count
self.create_time = create_time
self.modify_time = modify_time
self.auto_update = auto_update
self.update_start_time = update_start_time
self.update_end_time = update_end_time
self.agent_latest_version = agent_latest_version
self.service_logging = service_logging
self.iam_project_name = iam_project_name
def get_update_end_time(self):
"""
:return: 自动升级的结束时间
:rtype: str
"""
return self.update_end_time
def get_update_start_time(self):
"""
:return: 自动升级的开始时间
:rtype: str
"""
return self.update_start_time
def get_create_time(self):
"""
:return: 机器组创建时间
:rtype: str
"""
return self.create_time
def get_host_count(self):
"""
:return: 机器数量
:rtype: int
"""
return self.host_count
def get_modify_time(self):
"""
:return: 机器组修改时间
:rtype: str
"""
return self.modify_time
def get_host_group_type(self):
"""
:return: 机器组类型
:rtype: str
"""
return self.host_group_type
def get_host_group_id(self):
"""
:return: 机器组ID
:rtype: str
"""
return self.host_group_id
def get_host_identifier(self):
"""
:return: 机器标识符
:rtype: str
"""
return self.host_identifier
def get_abnormal_heartbeat_status_count(self):
"""
:return: 心跳异常的机器数量
:rtype: int
"""
return self.abnormal_heartbeat_status_count
def get_auto_update(self):
"""
:return: 是否开启自动升级功能
:rtype: bool
"""
return self.auto_update
def get_host_group_name(self):
"""
:return: 机器组名称
:rtype: str
"""
return self.host_group_name
def get_agent_latest_version(self):
"""
:return: 日志服务发布的LogCollector最新版本号
:rtype: str
"""
return self.agent_latest_version
def get_normal_heartbeat_status_count(self):
"""
:return: 心跳正常的机器数量
:rtype: int
"""
return self.normal_heartbeat_status_count
def get_rule_count(self):
"""
:return: 绑定的采集配置的数量
:rtype: int
"""
return self.rule_count
def get_service_logging(self):
"""
:return: 是否开启Logcollector服务日志功能
:rtype: bool
"""
return self.service_logging
def get_iam_project_name(self):
"""
:return: 机器组所属的IAM项目
:rtype: str
"""
return self.iam_project_name
class FilterKeyRegex(TLSData):
def __init__(self, key: str, regex: str):
"""
:param key: 过滤字段的名称
:type key:str
:param regex:过滤字段的日志内容需要匹配的正则表达式
:type regex:str
"""
self.key = key
self.regex = regex
@classmethod
def set_attributes(cls, data: dict):
key = data.get(KEY)
regex = data.get(REGEX)
return cls(key, regex)
class LogTemplate(TLSData):
def __init__(self, log_type: str, log_format: str):
"""
:param log_type:日志模板的类型:Nginx
:type log_type:str
:param log_format:日志模板内容
:type log_format:str
"""
self.log_type = log_type
self.log_format = log_format
def json(self):
return {TYPE: self.log_type, FORMAT: self.log_format}
class ExtractRule(TLSData):
def __init__(self, delimiter: str = None, begin_regex: str = None, log_regex: str = None, keys: List[str] = None,
time_key: str = None, time_format: str = None, filter_key_regex: List[FilterKeyRegex] = None,
un_match_up_load_switch: bool = None, un_match_log_key: str = None, log_template: LogTemplate = None,
quote: str = None):
"""
:param delimiter: 日志分隔符
:type delimiter: str
:param begin_regex: 第一行日志需要匹配的正则表达式
:type begin_regex: str
:param log_regex: 整条日志需要匹配的正则表达式
:type log_regex: str
:param keys: 日志字段名称
:type keys: List[str]
:param time_key: 日志时间字段的字段名称
:type time_key: str
:param time_format: 时间字段的解析格式
:type time_format: str
:param filter_key_regex: 时间字段的解析格式
:type filter_key_regex: List[FilterKeyRegex]
:param un_match_up_load_switch: 是否上传解析失败的日志
:type un_match_up_load_switch: bool
:param un_match_log_key: 当上传解析失败的日志时,解析失败的日志的key名称
:type un_match_log_key: str
:param log_template: 根据指定的日志模板自动提取日志字段
:type log_template: LogTemplate
:param quote: 引用符
:type quote: str
"""
assert (time_key is None and time_format is None) or (time_key is not None and time_format is not None)
assert (un_match_up_load_switch is None and un_match_log_key is None) or \
(un_match_up_load_switch is not None and un_match_log_key is not None)
self.delimiter = delimiter
self.begin_regex = begin_regex
self.log_regex = log_regex
self.keys = keys
self.time_key = time_key
self.time_format = time_format
self.filter_key_regex = filter_key_regex
self.un_match_up_load_switch = un_match_up_load_switch
self.un_match_log_key = un_match_log_key
self.log_template = log_template
self.quote = quote
@classmethod
def set_attributes(cls, data: dict):
extract_rule = super(ExtractRule, cls).set_attributes(data)
if FILTER_KEY_REGEX in data:
extract_rule.filter_key_regex = []
for one_filter_key_regex in data[FILTER_KEY_REGEX]:
extract_rule.filter_key_regex.append(FilterKeyRegex.set_attributes(data=one_filter_key_regex))
if LOG_TEMPLATE in data:
extract_rule.log_template = LogTemplate(log_type=data[LOG_TEMPLATE].get(TYPE),
log_format=data[LOG_TEMPLATE].get(FORMAT))
return extract_rule
def json(self):
json_data = super(ExtractRule, self).json()
if self.filter_key_regex is not None:
json_data[FILTER_KEY_REGEX] = []
for regex in self.filter_key_regex:
json_data[FILTER_KEY_REGEX].append(regex.json())
if self.log_template is not None:
json_data[LOG_TEMPLATE] = self.log_template.json()
return json_data
class ExcludePath(TLSData):
def __init__(self, path_type: str, value: str):
"""
:param path_type:采集路径类型,File或Path
:type path_type:str
:param value:采集绝对路径
:type value:str
"""
assert path_type == "File" or path_type == "Path"
self.path_type = path_type
self.value = value
def get_path_type(self):
"""
:return: 采集路径类型,File或Path
:rtype: str
"""
return self.path_type
def get_value(self):
"""
:return: 采集绝对路径
:rtype: str
"""
return self.value
@classmethod
def set_attributes(cls, data: dict):
path_type = data.get(TYPE)
value = data.get(VALUE)
return cls(path_type, value)
def json(self):
return {TYPE: self.path_type, VALUE: self.value}
class ParsePathRule(TLSData):
def __init__(self, path_sample: str, regex: str, keys: List[str]):
"""
:param path_sample:实际场景的采集路径样例
:type path_sample:str
:param regex: 用于提取路径字段的正则表达式
:type regex:str
:param keys:字段名称列表
:type keys: List[str]
"""
self.path_sample = path_sample
self.regex = regex
self.keys = keys
def get_path_sample(self):
"""
:return: 实际场景的采集路径样例
:rtype: str
"""
return self.path_sample
def get_regex(self):
"""
:return: 用于提取路径字段的正则表达式
:rtype: str
"""
return self.regex
def get_keys(self):
"""
:return: 字段名称列表
:rtype: List[str]
"""
return self.keys
@classmethod
def set_attributes(cls, data: dict):
path_sample = data.get(PATH_SAMPLE)
regex = data.get(REGEX)
keys = data.get(KEYS)
return cls(path_sample, regex, keys)
class ShardHashKey(TLSData):
def __init__(self, hash_key: str):
"""
:param hash_key:日志组的 HashKey
:type hash_key: str
"""
self.hash_key = hash_key
def get_hash_key(self):
"""
:return:日志组的 HashKey
:rtype: str
"""
return self.hash_key
class Plugin(TLSData):
def __init__(self, processors: List[Dict]):
"""
:param processors: LogCollector插件
:type processors: List[Dict]
"""
self.processors = processors
def get_processors(self):
"""
:return: LogCollector插件
:rtype: List[Dict]
"""
return self.processors
def json(self):
return {PROCESSORS: self.processors}
class Advanced(TLSData):
def __init__(self, close_inactive: int = 60, close_timeout: int = 0,
close_removed: bool = False, close_renamed: bool = False, close_eof: bool = False):
"""
:param close_inactive: 释放日志文件句柄的等待时间
:type close_inactive: int
:param close_timeout: LogCollector监控日志文件的最大时长
:type close_timeout: int
:param close_removed: 日志文件被移除之后,是否释放该日志文件的句柄
:type close_removed: bool
:param close_renamed: 日志文件被重命名之后,是否释放该日志文件的句柄
:type close_renamed: bool
:param close_eof: 读取至日志文件的末尾之后,是否释放该日志文件的句柄
:type close_eof: bool
"""
self.close_inactive = close_inactive
self.close_timeout = close_timeout
self.close_removed = close_removed
self.close_renamed = close_renamed
self.close_eof = close_eof
def get_close_inactive(self):
"""
:return: 释放日志文件句柄的等待时间
:rtype: int
"""
return self.close_inactive
def get_close_timeout(self):
"""
:return: LogCollector监控日志文件的最大时长
:rtype: int
"""
return self.close_timeout
def get_close_removed(self):
"""
:return: 日志文件被移除之后,是否释放该日志文件的句柄
:rtype: bool
"""
return self.close_removed
def get_close_renamed(self):
"""
:return: 日志文件被重命名之后,是否释放该日志文件的句柄
:rtype: bool
"""
return self.close_renamed
def get_close_eof(self):
"""
:return: 读取至日志文件的末尾之后,是否释放该日志文件的句柄
:rtype: bool
"""
return self.close_eof
def json(self):
return {CLOSE_INACTIVE: self.close_inactive, CLOSE_TIMEOUT: self.close_timeout,
CLOSE_REMOVED: self.close_removed, CLOSE_RENAMED: self.close_renamed, CLOSE_EOF: self.close_eof}
class UserDefineRule(TLSData):
def __init__(self, parse_path_rule: ParsePathRule = None, shard_hash_key: ShardHashKey = None,
enable_raw_log: bool = False, fields: dict = None, plugin: Plugin = None, advanced: Advanced = None,
tail_files: bool = False):
"""
:param parse_path_rule: 解析采集路径的规则
:type parse_path_rule: ParsePathRule
:param shard_hash_key: 路由日志分区的规则
:type shard_hash_key: ShardHashKey
:param enable_raw_log: 是否上传原始日志
:type enable_raw_log: bool
:param fields: 为日志添加常量字段
:type fields: dict
:param plugin: LogCollector插件配置
:type plugin: Plugin
:param advanced: LogCollector扩展配置
:type advanced: Advanced
:param tail_files: LogCollector采集策略,即指定LogCollector采集增量日志还是全量日志
:type tail_files: bool
"""
self.parse_path_rule = parse_path_rule
self.shard_hash_key = shard_hash_key
self.enable_raw_log = enable_raw_log
self.fields = fields
self.plugin = plugin
self.advanced = advanced
self.tail_files = tail_files
def get_enable_raw_log(self):
"""
:return:是否上传原始日志
:rtype:bool
"""
return self.enable_raw_log
def get_shard_hash_key(self):
"""
:return:路由日志分区的规则
:rtype: ShardHashKey
"""
return self.shard_hash_key
def get_fields(self):
"""
:return: 为日志添加常量字段
:rtype: dict
"""
return self.fields
def get_parse_path_rule(self):
"""
:return: 解析采集路径的规则
:rtype: ParsePathRule
"""
return self.parse_path_rule
def get_plugin(self):
"""
:return: LogCollector插件配置
:rtype: Plugin
"""
return self.plugin
def get_advanced(self):
"""
:return: LogCollector扩展配置
:rtype: Advanced
"""
return self.advanced
def get_tail_files(self):
"""
:return: LogCollector采集策略,即指定LogCollector采集增量日志还是全量日志
:rtype: bool
"""
return self.tail_files
@classmethod
def set_attributes(cls, data: dict):
user_define_rule = super(UserDefineRule, cls).set_attributes(data)
if SHARD_HASH_KEY in data:
user_define_rule.shard_hash_key = ShardHashKey(hash_key=data[SHARD_HASH_KEY].get(HASH_KEY))
if PARSE_PATH_RULE in data:
user_define_rule.parse_path_rule = ParsePathRule.set_attributes(data[PARSE_PATH_RULE])
if PLUGIN in data:
user_define_rule.plugin = Plugin(processors=data[PLUGIN].get(PROCESSORS))
if ADVANCED in data:
user_define_rule.advanced = Advanced(close_inactive=data[ADVANCED].get(CLOSE_INACTIVE),
close_timeout=data[ADVANCED].get(CLOSE_TIMEOUT),
close_removed=data[ADVANCED].get(CLOSE_REMOVED),
close_renamed=data[ADVANCED].get(CLOSE_RENAMED),
close_eof=data[ADVANCED].get(CLOSE_EOF))
return user_define_rule
def json(self):
json_data = super(UserDefineRule, self).json()
if self.shard_hash_key is not None:
json_data[SHARD_HASH_KEY] = self.shard_hash_key.json()
if self.parse_path_rule is not None:
json_data[PARSE_PATH_RULE] = self.parse_path_rule.json()
if self.plugin is not None:
json_data[PLUGIN] = self.plugin.json()
if self.advanced is not None:
json_data[ADVANCED] = self.advanced.json()
return json_data
class KubernetesRule(TLSData):
def __init__(self, namespace_name_regex: str = None, workload_type: str = None, workload_name_regex: str = None,
include_pod_label_regex: Dict[str, str] = None, exclude_pod_label_regex: Dict[str, str] = None,
pod_name_regex: str = None, label_tag: Dict[str, str] = None, annotation_tag: Dict[str, str] = None):
"""
:param namespace_name_regex: 待采集的Kubernetes Namespace名称,不指定Namespace名称时表示采集全部容器
:type namespace_name_regex: str
:param workload_type: 通过工作负载的类型指定采集的容器,仅支持选择一种类型
:type workload_type: str
:param workload_name_regex: 通过工作负载的名称指定待采集的容器
:type workload_name_regex: str
:param include_pod_label_regex: Pod Label白名单用于指定待采集的容器
:type include_pod_label_regex: Dict[str, str]
:param exclude_pod_label_regex: 通过Pod Label黑名单指定不采集的容器,不启用表示采集全部容器
:type exclude_pod_label_regex: Dict[str, str]
:param pod_name_regex: Pod名称用于指定待采集的容器
:type pod_name_regex: str
:param label_tag: 是否将Kubernetes Label作为日志标签,添加到原始日志数据中
:type label_tag: Dict[str, str]
:param annotation_tag: 是否将Kubernetes Annotation作为日志标签,添加到原始日志数据中
:type annotation_tag: Dict[str, str]
"""
self.namespace_name_regex = namespace_name_regex
self.workload_type = workload_type
self.workload_name_regex = workload_name_regex
self.include_pod_label_regex = include_pod_label_regex
self.exclude_pod_label_regex = exclude_pod_label_regex
self.pod_name_regex = pod_name_regex
self.label_tag = label_tag
self.annotation_tag = annotation_tag
def get_include_pod_label_regex(self):
"""
:return: Pod Label 白名单用于指定待采集的容器
:rtype:Dict[str, str]
"""
return self.include_pod_label_regex
def get_workload_name_regex(self):
"""
:return: 通过工作负载的名称指定待采集的容器
:rtype:str
"""
return self.workload_name_regex
def get_pod_name_regex(self):
"""
:return: Pod名称用于指定待采集的容器
:rtype: str
"""
return self.pod_name_regex
def get_exclude_pod_label_regex(self):
"""
:return: 通过 Pod Label 黑名单指定不采集的容器,不启用表示采集全部容器
:rtype: ict[str, str]
"""
return self.exclude_pod_label_regex
def get_label_tag(self):
"""
:return: 是否将 Kubernetes Label 作为日志标签,添加到原始日志数据中
:rtype: Dict[str, str]
"""
return self.label_tag
def get_namespace_name_regex(self):
"""
:return: 待采集的 Kubernetes Namespace 名称,不指定 Namespace 名称时表示采集全部容器
:rtype: str
"""
return self.namespace_name_regex
def get_workload_type(self):
"""
:return:通过工作负载的类型指定采集的容器,仅支持选择一种类型
:rtype: str
"""
return self.workload_type
def get_annotation_tag(self):
"""
:return: 是否将Kubernetes Annotation作为日志标签,添加到原始日志数据中
:rtype: Dict[str, str]
"""
return self.annotation_tag
class ContainerRule(TLSData):
def __init__(self, stream: str = None, container_name_regex: str = None,
include_container_label_regex: Dict[str, str] = None,
exclude_container_label_regex: Dict[str, str] = None,
include_container_env_regex: Dict[str, str] = None,
exclude_container_env_regex: Dict[str, str] = None,
env_tag: Dict[str, str] = None, kubernetes_rule: KubernetesRule = None):
"""
:param stream:采集模式
:type stream:str
:param container_name_regex:待采集的容器名称
:type container_name_regex:str
:param include_container_label_regex:指定待采集的容器,不启用白名单时指定采集全部容器
:type include_container_label_regex:Dict[str, str]
:param exclude_container_label_regex:黑名单用于指定不采集的容器范围,不启用黑名单时表示采集全部容器
:type exclude_container_label_regex:Dict[str, str]
:param include_container_env_regex:容器环境变量白名单通过容器环境变量指定待采集的容器,不启用白名单时表示指定采集全部容器
:type include_container_env_regex:Dict[str, str]
:param exclude_container_env_regex:容器环境变量黑名单用于指定不采集的容器范围,不启用黑名单时表示采集全部容器
:type exclude_container_env_regex:Dict[str, str]
:param env_tag:是否将环境变量作为日志标签,添加到原始日志数据中
:type env_tag:Dict[str, str]
:param kubernetes_rule:Kubernetes 容器的采集规则
:type kubernetes_rule:KubernetesRule
"""
self.stream = stream
self.container_name_regex = container_name_regex
self.include_container_label_regex = include_container_label_regex
self.exclude_container_label_regex = exclude_container_label_regex
self.include_container_env_regex = include_container_env_regex
self.exclude_container_env_regex = exclude_container_env_regex
self.env_tag = env_tag
self.kubernetes_rule = kubernetes_rule
def get_stream(self):
"""
:return 采集模式
:rtype str
"""
return self.stream
def get_exclude_container_env_regex(self):
"""
:return: 容器环境变量黑名单用于指定不采集的容器范围,不启用黑名单时表示采集全部容器
:rtype:Dict[str, str]
"""
return self.exclude_container_env_regex
def get_kubernetes_rule(self):
"""
:return: Kubernetes 容器的采集规则
:rtype: KubernetesRule
"""
return self.kubernetes_rule
def get_include_container_label_regex(self):
"""
:return: 指定待采集的容器,不启用白名单时指定采集全部容器
:rtype: Dict[str, str]
"""
return self.include_container_label_regex
def get_include_container_env_regex(self):
"""
:return: 容器环境变量白名单通过容器环境变量指定待采集的容器,不启用白名单时表示指定采集全部容器
:rtype: Dict[str, str]
"""
return self.include_container_env_regex
def get_exclude_container_label_regex(self):
"""
:return: 黑名单用于指定不采集的容器范围,不启用黑名单时表示采集全部容器
:rtype: Dict[str, str]
"""
return self.exclude_container_label_regex
def get_env_tag(self):
"""
:return: 是否将环境变量作为日志标签,添加到原始日志数据中
:rtype: Dict[str, str]
"""
return self.env_tag
def get_container_name_regex(self):
"""
:return:待采集的容器名称
:rtype: str
"""
return self.container_name_regex
@classmethod
def set_attributes(cls, data: dict):
container_rule = super(ContainerRule, cls).set_attributes(data)
if KUBERNETES_RULE in data:
container_rule.kubernetes_rule = KubernetesRule.set_attributes(data=data[KUBERNETES_RULE])
return container_rule
def json(self):
json_data = super(ContainerRule, self).json()
if self.kubernetes_rule is not None:
json_data[KUBERNETES_RULE] = self.kubernetes_rule.json()
return json_data
class RuleInfo(TLSData):
def __init__(self, topic_id: str = None, topic_name: str = None, rule_id: str = None, rule_name: str = None,
paths: List[str] = None, log_type: str = None, extract_rule: ExtractRule = None,
exclude_paths: List[ExcludePath] = None, log_sample: str = None,
user_define_rule: UserDefineRule = None, create_time: str = None, modify_time: str = None,
input_type: int = None, container_rule: ContainerRule = None):
self.topic_id = topic_id
self.topic_name = topic_name
self.rule_id = rule_id
self.rule_name = rule_name
self.paths = paths
self.log_type = log_type
self.extract_rule = extract_rule
self.exclude_paths = exclude_paths
self.log_sample = log_sample
self.user_define_rule = user_define_rule
self.create_time = create_time
self.modify_time = modify_time
self.input_type = input_type
self.container_rule = container_rule
def get_exclude_paths(self):
"""
:return:采集黑名单列表
:rtype:List[ExcludePath]
"""
return self.exclude_paths
def get_create_time(self):
"""
:return:采集配置创建的时间
:rtype:str
"""
return self.create_time
def get_rule_name(self):
"""
:return:采集配置的名称
:rtype:str
"""
return self.rule_name
def get_container_rule(self):
"""
:return:容器采集规则。详细说明请查看
:rtype:ContainerRule
"""
return self.container_rule
def get_modify_time(self):
return self.modify_time
def get_input_type(self):
return self.input_type
def get_user_define_rule(self):
return self.user_define_rule
def get_rule_id(self):
return self.rule_id
def get_log_type(self):
return self.log_type
def get_extract_rule(self):
return self.extract_rule
def get_paths(self):
return self.paths
def get_topic_name(self):
return self.topic_name
def get_topic_id(self):
return self.topic_id
def get_log_sample(self):
return self.log_sample
@classmethod
def set_attributes(cls, data: dict):
rule_info = super(RuleInfo, cls).set_attributes(data)
if EXTRACT_RULE in data:
rule_info.extract_rule = ExtractRule.set_attributes(data=data[EXTRACT_RULE])
if EXCLUDE_PATHS in data:
rule_info.exclude_paths = []
for exclude_path in data[EXCLUDE_PATHS]:
rule_info.exclude_paths.append(ExcludePath.set_attributes(data=exclude_path))
if USER_DEFINE_RULE in data:
rule_info.user_define_rule = UserDefineRule.set_attributes(data=data[USER_DEFINE_RULE])
if CONTAINER_RULE in data:
rule_info.container_rule = ContainerRule.set_attributes(data=data[CONTAINER_RULE])
return rule_info
class HostGroupHostsRulesInfo(TLSData):
def __init__(self, host_group_info: HostGroupInfo, host_infos: List[HostInfo], rule_infos: List[RuleInfo]):
self.host_group_info = host_group_info
self.host_infos = host_infos
self.rule_infos = rule_infos
def get_rule_infos(self):
"""
:return:所绑定的采集配置信息列表
:rtype: List[RuleInfo]
"""
return self.rule_infos
def get_host_group_info(self):
"""
:return: 机器组信息
:rtype:HostGroupInfo
"""
return self.host_group_info
def get_host_infos(self):
"""
:return:
:rtype:List[HostInfo]
"""
return self.host_infos
class Receiver(TLSData):
def __init__(self, receiver_type: str, receiver_names: List[str], receiver_channels: List[str],
start_time: str, end_time: str, webhook: str = None):
"""
:param receiver_type:接受者类型
:type receiver_type:str
:param receiver_names:接收者的名字
:type receiver_names:List[str]
:param receiver_channels:通知接收渠道,支持Email、Sms、Phone
:type receiver_channels:List[str]
:param start_time:可接收信息的时段中,开始的时间
:type start_time:str
:param end_time:可接收信息的时段中
:type end_time:str
:param webhook:飞书Webhook请求地址
:type webhook:str
"""
self.receiver_type = receiver_type
self.receiver_names = receiver_names
self.receiver_channels = receiver_channels
self.start_time = start_time
self.end_time = end_time
self.webhook = webhook
def get_start_time(self):
"""
:return:可接收信息的时段中,开始的时间
:rtype: str
"""
return self.start_time
def get_webhook(self):
"""
:return: 飞书Webhook请求地址
:rtype: str
"""
return self.webhook
def get_receiver_channels(self):
"""
:return:通知接收渠道,支持Email、Sms、Phone
:rtype: List[str]
"""
return self.receiver_channels
def get_end_time(self):
"""
:return: 可接收信息的时段中
:rtype:str
"""
return self.end_time
def get_receiver_names(self):
"""
:return: 接收者的名字
:rtype: List[str]
"""
return self.receiver_names
def get_receiver_type(self):
"""
:return:接受者类型
:rtype: str
"""
return self.receiver_type
@classmethod
def set_attributes(cls, data: dict):
receiver_type = data.get(RECEIVER_TYPE)
receiver_names = data.get(RECEIVER_NAMES)
receiver_channels = data.get(RECEIVER_CHANNELS)
start_time = data.get(START_TIME)
end_time = data.get(END_TIME)
webhook = data.get(WEBHOOK)
return cls(receiver_type, receiver_names, receiver_channels, start_time, end_time, webhook)
class QueryRequest(TLSData):
def __init__(self, topic_id: str, query: str, number: int,
start_time_offset: int, end_time_offset: int, topic_name: str = None, time_span_type: str = None,
truncated_time: str = None):
"""
:param topic_id: 日志主题ID
:type topic_id: str
:param query: 查询语句,支持的最大长度为1024
:type query: str
:param number: 告警对象序号(从1开始递增)
:type number: int
:param start_time_offset: 查询范围起始时间相对当前的历史时间,单位为分钟,取值为非正,最大值为0,最小值为-1440
:type start_time_offset: int
:param end_time_offset: 查询范围终止时间相对当前的历史时间,单位为分钟,取值为非正,须大于StartTimeOffset,最大值为0,最小值为-1440
:type end_time_offset: int
:param topic_name: 告警策略执行的日志主题名称
:type topic_name: str
:param time_span_type: 查询是否是整点时间, 新增整点时间,非必填,空白时默认为Relative
:type time_span_type: str
:param truncated_time: 对时间取整,对分钟/小时取整
:type truncated_time: str
"""
self.topic_id = topic_id
self.query = query
self.number = number
self.start_time_offset = start_time_offset
self.end_time_offset = end_time_offset
self.topic_name = topic_name
self.time_span_type = time_span_type
self.truncated_time = truncated_time
def get_number(self):
"""
:return:告警对象序号;从 1 开始递增
:rtype: int
"""
return self.number
def get_start_time_offset(self):
"""
:return: 查询范围起始时间相对当前的历史时间,单位为分钟,取值为非正,最大值为 0,最小值为 -1440
:rtype: int
"""
return self.start_time_offset
def get_query(self):
"""
:return:查询语句,支持的最大长度为 1024
:rtype: str
"""
return self.query
def get_topic_name(self):
"""
:return: 告警策略执行的日志主题名称
:rtype: str
"""
return self.topic_name
def get_topic_id(self):
"""
:return: 日志主题 ID
:rtype: str
"""
return self.topic_id
def get_end_time_offset(self):
"""
:return: 查询范围终止时间相对当前的历史时间,单位为分钟
:rtype: int
"""
return self.end_time_offset
def get_time_span_type(self):
"""
:return: 查询是否是整点时间, 新增整点时间,非必填,空白时默认为Relative
:rtype: str
"""
return self.time_span_type
def get_truncated_time(self):
"""
:return: 对时间取整,对分钟/小时取整
:rtype: str
"""
return self.truncated_time
@classmethod
def set_attributes(cls, data: dict):
topic_id = data.get(TOPIC_ID)
topic_name = data.get(TOPIC_NAME)
query = data.get(QUERY)
number = data.get(NUMBER)
start_time_offset = data.get(START_TIME_OFFSET)
end_time_offset = data.get(END_TIME_OFFSET)
time_span_type = data.get(TIME_SPAN_TYPE)
truncated_time = data.get(TRUNCATED_TIME)
return cls(topic_id, query, number, start_time_offset, end_time_offset, topic_name, time_span_type, truncated_time)
class RequestCycle(TLSData):
def __init__(self, cycle_type: str, time: int, cron_tab: str = None):
"""
:param cycle_type: 执行周期类型,Period:周期执行,Fixed:定期执行
:type cycle_type:str
:param time:告警任务执行的周期,或者定期执行的时间点。单位为分钟,取值范围为 1~1440
:type time:int
:param cron_tab:Cron表达式,日志服务通过 Cron 表达式指定告警任务定时执行。Cron 表达式的最小粒度为分钟,24 小时制
:type cron_tab:str
"""
self.cycle_type = cycle_type
self.time = time
self.cron_tab = cron_tab
def get_time(self):
"""
:return:告警任务执行的周期,或者定期执行的时间点。单位为分钟
:rtype: int
"""
return self.time
def get_cycle_type(self):
"""
:return:执行周期类型,Period:周期执行,Fixed:定期执行
:rtype: str
"""
return self.cycle_type
def get_cron_tab(self):
"""
:return:Cron表达式,日志服务通过 Cron 表达式指定告警任务定时执行
:rtype: str
"""
return self.cron_tab
@classmethod
def set_attributes(cls, data: dict):
cycle_type = data.get(TYPE)
time = data.get(TIME)
cron_tab = data.get(CRON_TAB)
return cls(cycle_type, time, cron_tab)
def json(self):
return {TYPE: self.cycle_type, TIME: self.time, CRON_TAB: self.cron_tab}
class AlarmNotifyGroupInfo(TLSData):
def __init__(self, alarm_notify_group_name: str = None, alarm_notify_group_id: str = None,
notify_type: List[str] = None, receivers: List[Receiver] = None,
create_time: str = None, modify_time: str = None, iam_project_name: str = None):
self.alarm_notify_group_name = alarm_notify_group_name
self.alarm_notify_group_id = alarm_notify_group_id
self.notify_type = notify_type
self.receivers = receivers
self.create_time = create_time
self.modify_time = modify_time
self.iam_project_name = iam_project_name
def get_alarm_notify_group_name(self):
"""
:return:告警通知组名称
:rtype: str
"""
return self.alarm_notify_group_name
def get_notify_type(self):
"""
:return:告警通知的类型:Trigger - 告警触发,Recovery - 告警恢复
:rtype: List[str]
"""
return self.notify_type
def get_create_time(self):
"""
:return:告警通知组创建的时间
:rtype:str
"""
return self.create_time
def get_receivers(self):
"""
:return:接收告警的 IAM 用户列表
:rtype:List[Receiver]
"""
return self.receivers
def get_modify_time(self):
"""
:return:告警通知组修改的时间
:rtype:str
"""
return self.modify_time
def get_alarm_notify_group_id(self):
"""
:return:告警通知组 ID
:rtype:str
"""
return self.alarm_notify_group_id
def get_iam_project_name(self):
"""
:return: 告警组所属的IAM项目
:rtype: str
"""
return self.iam_project_name
@classmethod
def set_attributes(cls, data: dict):
alarm_notify_group_info = super(AlarmNotifyGroupInfo, cls).set_attributes(data)
if RECEIVERS in data:
alarm_notify_group_info.receivers = []
for receiver in data[RECEIVERS]:
alarm_notify_group_info.receivers.append(Receiver.set_attributes(data=receiver))
return alarm_notify_group_info
class AlarmPeriodSetting(TLSData):
def __init__(self, sms: int, phone: int, email: int, general_webhook: int):
self.sms = sms
self.phone = phone
self.email = email
self.general_webhook = general_webhook
def json(self):
return {SMS: self.sms, PHONE: self.phone, EMAIL: self.email, GENERAL_WEBHOOK: self.general_webhook}
class JoinConfig(TLSData):
def __init__(self, set_operation_type: str = None, condition: str = None):
self.condition = condition
self.set_operation_type = set_operation_type
class TriggerCondition(TLSData):
def __init__(self, severity: str = "notice", condition: str = None, count_condition: str = None):
self.severity = severity
self.condition = condition
self.count_condition = count_condition
class AlarmInfo(TLSData):
def __init__(self, alarm_name: str = None, alarm_id: str = None, project_id: str = None, status: bool = None,
query_request: List[QueryRequest] = None, request_cycle: RequestCycle = None, condition: str = None,
trigger_period: int = None, alarm_period: int = None,
alarm_notify_group: List[AlarmNotifyGroupInfo] = None, user_define_msg: str = None,
create_time: str = None, modify_time: str = None,
severity: str = None, alarm_period_detail: AlarmPeriodSetting = None,
join_configurations: List[JoinConfig] = None, trigger_conditions: List[TriggerCondition] = None):
self.alarm_name = alarm_name
self.alarm_id = alarm_id
self.project_id = project_id
self.status = status
self.query_request = query_request
self.request_cycle = request_cycle
self.condition = condition
self.trigger_period = trigger_period
self.alarm_period = alarm_period
self.alarm_notify_group = alarm_notify_group
self.user_define_msg = user_define_msg
self.create_time = create_time
self.modify_time = modify_time
self.severity = severity
self.alarm_period_detail = alarm_period_detail
self.join_configurations = join_configurations
self.trigger_conditions = trigger_conditions
def get_alarm_name(self):
"""
:return:告警策略名称
:rtype: str
"""
return self.alarm_name
def get_alarm_notify_group(self):
"""
:return:告警对应的通知列表
:rtype:List[AlarmNotifyGroupInfo]
"""
return self.alarm_notify_group
def get_request_cycle(self):
"""
:return:告警任务的执行周期
:rtype:RequestCycle
"""
return self.request_cycle
def get_alarm_period(self):
"""
:return:告警重复的周期
:rtype: int
"""
return self.alarm_period
def get_create_time(self):
"""
:return:创建告警策略的时间
:rtype:str
"""
return self.create_time
def get_modify_time(self):
"""
:return:告警策略最近修改的时间
:rtype:str
"""
return self.modify_time
def get_user_define_msg(self):
"""
:return:告警通知的内容
:rtype:str
"""
return self.user_define_msg
def get_condition(self):
"""
:return:告警触发条件
:rtype:str
"""
return self.condition
def get_query_request(self):
"""
:return:检索分析语句,可配置 1~3 条
:rtype:List[QueryRequest]
"""
return self.query_request
def get_project_id(self):
"""
:return:日志项目 ID
:rtype: str
"""
return self.project_id
def get_trigger_period(self):
"""
:return:持续周期
:rtype:int
"""
return self.trigger_period
def get_alarm_id(self):
"""
:return:告警策略的 ID
:rtype: str
"""
return self.alarm_id
def get_status(self):
"""
:return:是否开启告警策略
:rtype:bool
"""
return self.status
def get_severity(self):
"""
:return: 告警通知的级别,即告警的严重程度
:rtype: str
"""
return self.severity
def get_alarm_period_detail(self):
"""
:return: 告警通知发送的周期
:rtype: AlarmPeriodSetting
"""
return self.alarm_period_detail
def get_join_configurations(self):
"""
:return: 告警策略的 Join 配置
:rtype: List[JoinConfig]
"""
return self.join_configurations
def get_trigger_conditions(self):
"""
:return: 告警策略的触发条件
:rtype: List[TriggerCondition]
"""
return self.trigger_conditions
@classmethod
def set_attributes(cls, data: dict):
alarm_info = super(AlarmInfo, cls).set_attributes(data)
if REQUEST_CYCLE in data:
alarm_info.request_cycle = RequestCycle.set_attributes(data=data[REQUEST_CYCLE])
if QUERY_REQUEST in data:
alarm_info.query_request = []
for one_query_request in data[QUERY_REQUEST]:
alarm_info.query_request.append(QueryRequest.set_attributes(data=one_query_request))
if ALARM_NOTIFY_GROUP in data:
alarm_info.alarm_notify_group = []
for alarm_notify_group in data[ALARM_NOTIFY_GROUP]:
alarm_info.alarm_notify_group.append(AlarmNotifyGroupInfo.set_attributes(data=alarm_notify_group))
if ALARM_PERIOD_DETAIL in data:
if len(data[ALARM_PERIOD_DETAIL]) == 0:
alarm_info.alarm_period_detail = None
else:
sms = data[ALARM_PERIOD_DETAIL].get(SMS)
phone = data[ALARM_PERIOD_DETAIL].get(PHONE)
email = data[ALARM_PERIOD_DETAIL].get(EMAIL)
general_webhook = data[ALARM_PERIOD_DETAIL].get(GENERAL_WEBHOOK)
alarm_info.alarm_period_detail = AlarmPeriodSetting(sms, phone, email, general_webhook)
if JOIN_CONFIGURATIONS in data and data[JOIN_CONFIGURATIONS] is not None:
alarm_info.join_configurations = []
for join_configuration in data[JOIN_CONFIGURATIONS]:
alarm_info.join_configurations.append(JoinConfig.set_attributes(data=join_configuration))
if TRIGGER_CONDITIONS in data and data[TRIGGER_CONDITIONS] is not None:
alarm_info.trigger_conditions = []
for trigger_condition in data[TRIGGER_CONDITIONS]:
alarm_info.trigger_conditions.append(TriggerCondition.set_attributes(data=trigger_condition))
return alarm_info
class ConsumerGroup(TLSData):
def __init__(self, project_id: str = None, consumer_group_name: str = None,
heartbeat_ttl: int = None, ordered_consume: bool = None):
self.project_id = project_id
self.consumer_group_name = consumer_group_name
self.heartbeat_ttl = heartbeat_ttl
self.ordered_consume = ordered_consume
@classmethod
def set_attributes(cls, data: dict):
project_id = data.get(PROJECT_ID_UPPERCASE)
consumer_group_name = data.get(CONSUMER_GROUP_NAME)
heartbeat_ttl = data.get(HEARTBEAT_TTL)
ordered_consume = data.get(ORDERED_CONSUME)
return cls(project_id, consumer_group_name, heartbeat_ttl, ordered_consume)
class ConsumeShard(TLSData):
def __init__(self, topic_id: str = None, shard_id: int = None):
self.topic_id = topic_id
self.shard_id = shard_id
@classmethod
def set_attributes(cls, data: dict):
topic_id = data.get(TOPIC_ID_UPPERCASE)
shard_id = data.get(SHARD_ID_UPPERCASE)
return cls(topic_id, shard_id)