Skip to content

Commit 0c4310b

Browse files
seolmin@megazone.comseolmin
authored andcommitted
feat: add cloud logging connector
1 parent 48f6dad commit 0c4310b

14 files changed

Lines changed: 204 additions & 17 deletions

File tree

pkg/pip_requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
spaceone-core
22
spaceone-api
3+
google-api-python-client
34
schematics
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
PROTO = {
2-
'spaceone.monitoring.api.plugin.data_source': ['DataSource'],
3-
'spaceone.monitoring.api.plugin.log': ['Log'],
2+
'cloudforet.monitoring.api.plugin.data_source': ['DataSource'],
3+
'cloudforet.monitoring.api.plugin.log': ['Log'],
44
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from cloudforet.monitoring.connector.cloud_logging_connector import CloudLoggingConnector
Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,57 @@
11
import logging
2-
from cloudforet.monitoring.libs.google_connector import GoogleConnector
2+
from cloudforet.monitoring.libs.google_cloud_connector import GoogleCloudConnector
33

44
_LOGGER = logging.getLogger(__name__)
55

66

7-
class CloudTrailConnector(GoogleConnector):
7+
class CloudLoggingConnector(GoogleCloudConnector):
8+
google_client_service = 'logging'
9+
version = 'v2'
810

911
def __init__(self, **kwargs):
1012
super().__init__(**kwargs)
13+
14+
def list_log_entries(self, params):
15+
print(params)
16+
query = params['query']
17+
start = params['start']
18+
end = params['end']
19+
20+
_query = {
21+
'filter': self._generate_logging_filter(query, start, end),
22+
'orderBy': 'timestamp desc'
23+
}
24+
print(_query)
25+
request = self.client.entries().list(**_query)
26+
27+
logs = []
28+
while request is not None:
29+
response = request.execute()
30+
logs = [log for log in response.get('entries', [])]
31+
request = self.client.entries().list_next(previous_request=request, previous_response=response)
32+
return logs
33+
34+
@staticmethod
35+
def _generate_logging_filter(query, start, end):
36+
logging_filter = ''
37+
log_filters = query.get('filters', [])
38+
for log_filter in log_filters:
39+
_filter = []
40+
resource_type = log_filter.get('resource_type')
41+
labels = log_filter.get('labels', {})
42+
if resource_type:
43+
_filter.append(f'resource.type={resource_type}')
44+
if labels:
45+
for key, value in labels.items():
46+
_filter.append(f'{key}={value}')
47+
if logging_filter:
48+
logging_filter += f' OR ({" AND ".join(_filter)})'
49+
else:
50+
logging_filter += f'({" AND ".join(_filter)})'
51+
52+
if logging_filter:
53+
logging_filter += f' AND timestamp >= "{start}" AND timestamp <= "{end}"'
54+
else:
55+
logging_filter += f'timestamp >= "{start}" AND timestamp <= "{end}"'
56+
57+
return logging_filter
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import logging
2+
import google.oauth2.service_account
3+
import googleapiclient
4+
import googleapiclient.discovery
5+
import logging
6+
from spaceone.core.connector import BaseConnector
7+
8+
DEFAULT_SCHEMA = 'google_oauth_client_id'
9+
_LOGGER = logging.getLogger(__name__)
10+
11+
12+
class GoogleCloudConnector(BaseConnector):
13+
google_client_service = 'compute'
14+
version = 'v1'
15+
16+
def __init__(self, **kwargs):
17+
"""
18+
kwargs
19+
- schema
20+
- options
21+
- secret_data
22+
23+
secret_data(dict)
24+
- type: ..
25+
- project_id: ...
26+
- token_uri: ...
27+
- ...
28+
"""
29+
30+
super().__init__(transaction=None, config=None)
31+
secret_data = kwargs.get('secret_data')
32+
self.project_id = secret_data.get('project_id')
33+
self.credentials = google.oauth2.service_account.Credentials.from_service_account_info(secret_data)
34+
self.client = googleapiclient.discovery.build(self.google_client_service,
35+
self.version,
36+
credentials=self.credentials)
37+
38+
def verify(self, **kwargs):
39+
if self.client is None:
40+
self.set_connect(**kwargs)
41+
42+
def generate_query(self, **query):
43+
query.update({
44+
'project': self.project_id,
45+
})
46+
return query
47+
48+
def list_zones(self, **query):
49+
query = self.generate_query(**query)
50+
result = self.client.zones().list(**query).execute()
51+
return result.get('items', [])

src/cloudforet/monitoring/libs/google_connector.py

Lines changed: 0 additions & 5 deletions
This file was deleted.

src/cloudforet/monitoring/manager/data_source_manager.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import logging
22
from spaceone.core.manager import BaseManager
3-
# from cloudforet.monitoring.connector.cloudtrail_connector import CloudTrailConnector
43
from cloudforet.monitoring.model.data_source_response_model import DataSourceMetadata
54
from cloudforet.monitoring.manager.metadata_manager import MetadataManager
5+
from cloudforet.monitoring.connector.cloud_logging_connector import CloudLoggingConnector
66
from cloudforet.monitoring.conf.monitoring_conf import *
77

88
_LOGGER = logging.getLogger(__name__)
@@ -21,6 +21,5 @@ def init(params):
2121
return response_model.to_primitive()
2222

2323
def verify(self, params):
24-
pass
25-
# cloudtrail_connector: CloudTrailConnector = self.locator.get_connector('CloudTrailConnector', **params)
26-
# cloudtrail_connector.set_client(DEFAULT_REGION)
24+
cloud_logging_connector: CloudLoggingConnector = self.locator.get_connector(CloudLoggingConnector, **params)
25+
cloud_logging_connector.verify()

src/cloudforet/monitoring/manager/metadata_manager.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ def __init__(self, **kwargs):
1515
@staticmethod
1616
def get_data_source_metadata():
1717
metadata = LogMetadata.set_fields(
18-
name='cloudtrail-table',
18+
name='cloud-logging-table',
1919
fields=[
2020
# MoreField.data_source('Event Name', 'event_name', options={
2121
# 'layout': {

src/cloudforet/monitoring/manager/monitoring_manager.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,15 @@
22
import logging
33
from spaceone.core.manager import BaseManager
44

5+
from cloudforet.monitoring.connector import CloudLoggingConnector
6+
57

68
class MonitoringManager(BaseManager):
79
def __init__(self, transaction):
810
super().__init__(transaction)
11+
12+
def list_logs(self, params):
13+
cloud_logging_conn: CloudLoggingConnector = self.locator.get_connector(CloudLoggingConnector, **params)
14+
15+
logs = cloud_logging_conn.list_log_entries(params)
16+
print(logs)

src/cloudforet/monitoring/model/metadata/metadata.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ class MetaDataView(Model):
2222

2323
class LogMetadata(Model):
2424
view = ModelType(MetaDataView)
25-
required_keys = ListType(StringType, default=['data.cloudtrail'])
26-
supported_providers = ListType(StringType, default=['aws'])
25+
required_keys = ListType(StringType, default=['data.google_cloud_logging'])
26+
supported_providers = ListType(StringType, default=['google_cloud'])
2727

2828
@classmethod
2929
def set_fields(cls, name='', fields=[]):

0 commit comments

Comments
 (0)