Skip to content

Commit 203fcc3

Browse files
seolminseolmin@megazone.com
authored andcommitted
feat: add metadata and event model
Signed-off-by: seolmin@megazone.com <seolmin@mz.co.kr>
1 parent 5e32661 commit 203fcc3

6 files changed

Lines changed: 118 additions & 46 deletions

File tree

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,5 @@
1-
from spaceone.core.error import *
1+
from spaceone.core.error import *
2+
3+
4+
class ERROR_CONVERT_EVENT(ERROR_BASE):
5+
_message = 'Failed to convert event ({event}) to Event VO. ({error})'
Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import logging
22
from spaceone.core.manager import BaseManager
33
from cloudforet.monitoring.model.metadata.metadata import LogMetadata
4-
from cloudforet.monitoring.model.metadata.metadata_dynamic_field import TextDyField, DateTimeDyField, ListDyField, \
4+
from cloudforet.monitoring.model.metadata.metadata_dynamic_field import TextDyField, DateTimeDyField, EnumDyField, \
55
MoreField
66

77
_LOGGER = logging.getLogger(__name__)
@@ -17,22 +17,27 @@ def get_data_source_metadata():
1717
metadata = LogMetadata.set_fields(
1818
name='cloud-logging-table',
1919
fields=[
20-
# MoreField.data_source('Event Name', 'event_name', options={
21-
# 'layout': {
22-
# 'name': 'Event Details',
23-
# 'type': 'popup',
24-
# 'options': {
25-
# 'layout': {
26-
# 'type': 'raw'
27-
# }
28-
# }
29-
# }
30-
# }),
31-
# TextDyField.data_source('User Name', 'username'),
32-
# DateTimeDyField.data_source('Event Time', 'event_time'),
33-
# TextDyField.data_source('Access Key ID', 'access_key_id'),
34-
# TextDyField.data_source('Region', 'cloud_trail_event.awsRegion'),
35-
# TextDyField.data_source('Error Message', 'cloud_trail_event.errorMessage')
20+
MoreField.data_source('Event Name', 'log_name', options={
21+
'layout': {
22+
'name': 'Event Details',
23+
'type': 'popup',
24+
'options': {
25+
'layout': {
26+
'type': 'raw'
27+
}
28+
}
29+
}
30+
}),
31+
EnumDyField.data_source('Severity', 'severity', default_badge={
32+
'red.500': ['ALERT', 'EMERGENCY'],
33+
'coral.500': ['ERROR', 'CRITICAL'],
34+
'yellow.300': ['NOTICE', 'WARNING'],
35+
'gray.500': ['DEBUG', 'INFO', 'NOTICE'],
36+
'black': ['DEFAULT']
37+
}),
38+
TextDyField.data_source('Method name', 'proto_payload.methodName'),
39+
TextDyField.data_source('User Name', 'proto_payload.authenticationInfo.principalEmail'),
40+
DateTimeDyField.data_source('Event Time', 'timestamp'),
3641
]
3742
)
3843
return metadata
Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
import copy
21
import logging
32
from spaceone.core.manager import BaseManager
4-
53
from cloudforet.monitoring.connector import CloudLoggingConnector
4+
from cloudforet.monitoring.model.log_model import Event, Log
5+
from cloudforet.monitoring.error.custom_error import ERROR_CONVERT_EVENT
6+
7+
_LOGGER = logging.getLogger(__name__)
68

79

810
class MonitoringManager(BaseManager):
@@ -13,4 +15,13 @@ def list_logs(self, params):
1315
cloud_logging_conn: CloudLoggingConnector = self.locator.get_connector('CloudLoggingConnector', **params)
1416

1517
for logs in cloud_logging_conn.list_log_entries(params):
16-
print(logs)
18+
19+
event_vos = []
20+
for log in logs:
21+
if log.get('protoPayload'):
22+
try:
23+
event_vos.append(Event(log))
24+
except Exception as e:
25+
raise ERROR_CONVERT_EVENT(event=log, error=e)
26+
27+
yield Log({'results': event_vos})
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
from schematics import Model
2+
from schematics.types import ModelType, StringType, BaseType, DictType, IntType, BooleanType, UnionType
3+
4+
5+
class Display(Model):
6+
pass
7+
8+
9+
class MonitoredResource(Model):
10+
type = StringType()
11+
labels = DictType(StringType)
12+
13+
14+
class HttpRequest(Model):
15+
request_method = StringType(deserialize_from='requestMethod')
16+
request_url = StringType(deserialize_from='requestUrl')
17+
request_size = StringType(deserialize_from='requestSize')
18+
status = IntType()
19+
response_size = StringType(deserialize_from='responseSize')
20+
user_agent = StringType(deserialize_from='userAgent')
21+
remote_ip = StringType(deserialize_from='remoteIp')
22+
server_ip = StringType(deserialize_from='serverIp')
23+
referer = StringType()
24+
latency = StringType()
25+
cache_lookup = BooleanType(deserialize_from='cacheLookup')
26+
cache_hit = BooleanType(deserialize_from='cacheHit')
27+
cache_validated_with_origin_server = BooleanType(deserialize_from='cacheValidatedWithOriginServer')
28+
cache_fill_bytes = StringType(deserialize_from='cacheFillBytes')
29+
protocol = StringType()
30+
31+
32+
class LogEntryOperation(Model):
33+
id = StringType()
34+
producer = StringType()
35+
first = BooleanType()
36+
last = BooleanType()
37+
38+
39+
class LogEntrySourceLocation(Model):
40+
file = StringType()
41+
function = StringType()
42+
line = StringType()
43+
44+
45+
class LogSplit(Model):
46+
uid = StringType()
47+
index = IntType()
48+
total_splits = IntType(deserialize_from='totalSplits')
49+
50+
51+
class Event(Model):
52+
insert_id = StringType(deserialize_from='insertId')
53+
log_name = StringType(deserialize_from='logName')
54+
resource = ModelType(MonitoredResource)
55+
timestamp = StringType()
56+
receive_timestamp = StringType(deserialize_from='receiveTimestamp')
57+
severity = StringType()
58+
http_request = ModelType(HttpRequest)
59+
labels = DictType(StringType)
60+
operation = ModelType(LogEntryOperation)
61+
trace = StringType()
62+
span_id = StringType(deserialize_from='spanId')
63+
trace_sampled = BooleanType(deserialize_from='traceSampled')
64+
source_location = ModelType(LogEntrySourceLocation, deserialize_from='sourceLocation')
65+
split = ModelType(LogSplit)
66+
proto_payload = BaseType(deserialize_from='protoPayload')
67+
display = ModelType(Display)
68+
69+
class Options:
70+
serialize_when_none = False

src/cloudforet/monitoring/model/log_model.py

Lines changed: 2 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,6 @@
11
from schematics import Model
2-
from schematics.types import ModelType, StringType, DateTimeType, ListType, DictType, BaseType
3-
4-
5-
class Resource(Model):
6-
resource_type = StringType(deserialize_from='ResourceType', serialize_when_none=False)
7-
resource_name = StringType(deserialize_from='ResourceName', serialize_when_none=False)
8-
9-
10-
class Event(Model):
11-
pass
12-
# event_id = StringType(deserialize_from='EventId', serialize_when_none=False)
13-
# event_name = StringType(deserialize_from='EventName', serialize_when_none=False)
14-
# read_only = StringType(deserialize_from='ReadOnly', serialize_when_none=False)
15-
# access_key_id = StringType(deserialize_from='AccessKeyId', serialize_when_none=False)
16-
# event_time = DateTimeType(deserialize_from='EventTime', serialize_when_none=False)
17-
# event_source = StringType(deserialize_from='EventSource', serialize_when_none=False)
18-
# username = StringType(deserialize_from='Username', serialize_when_none=False)
19-
# resources = ListType(ModelType(Resource), deserialize_from='Resources', default=[])
20-
# # cloud_trail_event = StringType(deserialize_from='CloudTrailEvent', serialize_when_none=False)
21-
# cloud_trail_event = DictType(BaseType, deserialize_from='CloudTrailEvent', serialize_when_none=False)
2+
from schematics.types import ModelType, ListType
3+
from cloudforet.monitoring.model.event_model import Event
224

235

246
class Log(Model):

test/api/test_log.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,22 +49,22 @@ def test_log_list(self):
4949
'options': {},
5050
'secret_data': secret_data,
5151
'query': {
52-
'resource_id': '',
52+
'resource_id': '969092xxxxx',
5353
'name': 'projects/bluese-cloudone-20200113',
5454
'filter': [
5555
{
56-
'resource_type': 'gec_instance',
56+
'resource_type': 'gce_instance',
5757
'labels': [
5858
{
5959
'key': 'resource.labels.instance_id',
60-
'value': ''
60+
'value': '969092xxxxx'
6161
}
6262
]
6363
}
6464
]
6565
},
66-
'start': '2023-03-21T09:00:00.717Z',
67-
'end': '2023-11-14T16:00:00.717Z'
66+
'start': '2023-03-21T00:00:00Z',
67+
'end': '2023-03-21T23:00:00Z'
6868
}
6969

7070
resource_stream = self.monitoring.Log.list(params)

0 commit comments

Comments
 (0)