blob: 3252c7a39f0ae60b78823c859d46f17aa2b76de7 [file] [log] [blame]
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
import logging
import requests
from skywalking import config
from skywalking.client import ServiceManagementClient, TraceSegmentReportService
logger = logging.getLogger(__name__)
class HttpServiceManagementClient(ServiceManagementClient):
def __init__(self):
self.session = requests.session()
def send_instance_props(self):
url = config.collector_address.rstrip('/') + '/v3/management/reportProperties'
res = self.session.post(url, json={
'service': config.service_name,
'serviceInstance': config.service_instance,
'properties': [{
'language': 'Python',
}]
})
logger.debug('heartbeat response: %s', res)
def send_heart_beat(self):
logger.debug(
'service heart beats, [%s], [%s]',
config.service_name,
config.service_instance,
)
url = config.collector_address.rstrip('/') + '/v3/management/keepAlive'
res = self.session.post(url, json={
'service': config.service_name,
'serviceInstance': config.service_instance,
})
logger.debug('heartbeat response: %s', res)
class HttpTraceSegmentReportService(TraceSegmentReportService):
def __init__(self):
self.session = requests.session()
def report(self, generator):
url = config.collector_address.rstrip('/') + '/v3/segment'
for segment in generator:
res = self.session.post(url, json={
'traceId': str(segment.related_traces[0]),
'traceSegmentId': str(segment.segment_id),
'service': config.service_name,
'serviceInstance': config.service_instance,
'spans': [{
'spanId': span.sid,
'parentSpanId': span.pid,
'startTime': span.start_time,
'endTime': span.end_time,
'operationName': span.op,
'peer': span.peer,
'spanType': span.kind.name,
'spanLayer': span.layer.name,
'componentId': span.component.value,
'isError': span.error_occurred,
'logs': [{
'time': log.timestamp * 1000,
'data': [{
'key': item.key,
'value': item.val
} for item in log.items],
} for log in span.logs],
'tags': [{
'key': tag.key,
'value': tag.val,
} for tag in span.tags],
'refs': [{
'refType': 0,
'traceId': ref.trace_id,
'parentTraceSegmentId': ref.segment_id,
'parentSpanId': ref.span_id,
'parentService': ref.service,
'parentServiceInstance': ref.service_instance,
'parentEndpoint': ref.endpoint,
'networkAddressUsedAtPeer': ref.client_address,
} for ref in span.refs if ref.trace_id]
} for span in segment.spans]
})
logger.debug('report traces response: %s', res)