Coverage for chalicelib/core/log_tools/cloudwatch.py: 42%
58 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-10 12:56 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-10 12:56 +0000
1import boto3
2from chalicelib.core.log_tools import log_tools
3from schemas import schemas
5IN_TY = "cloudwatch"
8def __find_groups(client, token):
9 d_args = {
10 "limit": 50
11 }
12 if token is not None:
13 d_args["nextToken"] = token
14 response = client.describe_log_groups(**d_args)
15 response["logGroups"] = [i['logGroupName'] for i in response["logGroups"]]
16 if "nextToken" not in response:
17 return response["logGroups"]
19 return response["logGroups"] + __find_groups(client, response["nextToken"])
22def __find_streams(project_id, log_group, client, token, stream_filter):
23 d_args = {"logGroupName": log_group, "orderBy": 'LastEventTime', 'limit': 50}
24 if token is not None and len(token) > 0:
25 d_args["nextToken"] = token
26 data = client.describe_log_streams(**d_args)
27 streams = list(filter(stream_filter, data['logStreams']))
28 if 'nextToken' not in data:
29 save_new_token(project_id=project_id, token=token)
30 return streams
31 return streams + __find_streams(project_id, log_group, client, data['nextToken'], stream_filter)
34def __find_events(client, log_group, streams, last_token, start_time, end_time):
35 f_args = {
36 "logGroupName": log_group,
37 "logStreamNames": streams,
38 "startTime": start_time,
39 "endTime": end_time,
40 "limit": 10000,
41 "filterPattern": "openreplay_session_id"
42 }
43 if last_token is not None:
44 f_args["nextToken"] = last_token
45 response = client.filter_log_events(
46 **f_args
47 )
48 if "nextToken" not in response:
49 return response["events"]
51 return response["events"] + __find_events(client, log_group, streams, response["nextToken"], start_time, end_time)
54def list_log_groups(aws_access_key_id, aws_secret_access_key, region):
55 logs = boto3.client('logs', aws_access_key_id=aws_access_key_id,
56 aws_secret_access_key=aws_secret_access_key,
57 region_name=region
58 )
59 return __find_groups(logs, None)
62def get_all(tenant_id):
63 return log_tools.get_all_by_tenant(tenant_id=tenant_id, integration=IN_TY)
66def get(project_id):
67 return log_tools.get(project_id=project_id, integration=IN_TY)
70def update(tenant_id, project_id, changes):
71 options = {}
72 if "authorization_token" in changes: 72 ↛ 73line 72 didn't jump to line 73 because the condition on line 72 was never true
73 options["authorization_token"] = changes.pop("authorization_token")
74 if "project_id" in changes: 74 ↛ 75line 74 didn't jump to line 75 because the condition on line 74 was never true
75 options["project_id"] = changes.pop("project_id")
76 if len(options.keys()) > 0: 76 ↛ 77line 76 didn't jump to line 77 because the condition on line 76 was never true
77 changes["options"] = options
78 return log_tools.edit(project_id=project_id, integration=IN_TY, changes=changes)
81def add(tenant_id, project_id, aws_access_key_id, aws_secret_access_key, log_group_name, region):
82 return log_tools.add(project_id=project_id, integration=IN_TY,
83 options={"awsAccessKeyId": aws_access_key_id,
84 "awsSecretAccessKey": aws_secret_access_key,
85 "logGroupName": log_group_name, "region": region})
88def save_new_token(project_id, token):
89 update(tenant_id=None, project_id=project_id, changes={"last_token": token})
92def delete(tenant_id, project_id):
93 return log_tools.delete(project_id=project_id, integration=IN_TY)
96def add_edit(tenant_id, project_id, data: schemas.IntegrationCloudwatchSchema):
97 s = get(project_id)
98 if s is not None:
99 return update(tenant_id=tenant_id, project_id=project_id,
100 changes={"awsAccessKeyId": data.aws_access_key_id,
101 "awsSecretAccessKey": data.aws_secret_access_key,
102 "logGroupName": data.log_group_name,
103 "region": data.region})
104 else:
105 return add(tenant_id=tenant_id,
106 project_id=project_id,
107 aws_access_key_id=data.aws_access_key_id,
108 aws_secret_access_key=data.aws_secret_access_key,
109 log_group_name=data.log_group_name,
110 region=data.region)