|
27 | 27 | from opencensus.ext.azure.common.transport import TransportMixin |
28 | 28 | from opencensus.trace.span import SpanKind |
29 | 29 |
|
| 30 | +try: |
| 31 | + from urllib.parse import urlparse |
| 32 | +except ImportError: |
| 33 | + from urlparse import urlparse |
| 34 | + |
30 | 35 | logger = logging.getLogger(__name__) |
31 | 36 |
|
32 | 37 | __all__ = ['AzureExporter'] |
@@ -55,66 +60,86 @@ def span_data_to_envelope(self, sd): |
55 | 60 | tags=dict(utils.azure_monitor_context), |
56 | 61 | time=sd.start_time, |
57 | 62 | ) |
| 63 | + |
58 | 64 | envelope.tags['ai.operation.id'] = sd.context.trace_id |
59 | 65 | if sd.parent_span_id: |
60 | | - envelope.tags['ai.operation.parentId'] = '|{}.{}.'.format( |
61 | | - sd.context.trace_id, |
| 66 | + envelope.tags['ai.operation.parentId'] = '{}'.format( |
62 | 67 | sd.parent_span_id, |
63 | 68 | ) |
64 | 69 | if sd.span_kind == SpanKind.SERVER: |
65 | 70 | envelope.name = 'Microsoft.ApplicationInsights.Request' |
66 | 71 | data = Request( |
67 | | - id='|{}.{}.'.format(sd.context.trace_id, sd.span_id), |
| 72 | + id='{}'.format(sd.span_id), |
68 | 73 | duration=utils.timestamp_to_duration( |
69 | 74 | sd.start_time, |
70 | 75 | sd.end_time, |
71 | 76 | ), |
72 | | - responseCode='0', |
73 | | - success=False, |
| 77 | + responseCode=str(sd.status.code), |
| 78 | + success=False, # Modify based off attributes or status |
74 | 79 | properties={}, |
75 | 80 | ) |
76 | 81 | envelope.data = Data(baseData=data, baseType='RequestData') |
| 82 | + data.name = '' |
77 | 83 | if 'http.method' in sd.attributes: |
78 | 84 | data.name = sd.attributes['http.method'] |
79 | 85 | if 'http.route' in sd.attributes: |
80 | 86 | data.name = data.name + ' ' + sd.attributes['http.route'] |
81 | 87 | envelope.tags['ai.operation.name'] = data.name |
| 88 | + data.properties['request.name'] = data.name |
| 89 | + elif 'http.path' in sd.attributes: |
| 90 | + data.properties['request.name'] = data.name + \ |
| 91 | + ' ' + sd.attributes['http.path'] |
82 | 92 | if 'http.url' in sd.attributes: |
83 | 93 | data.url = sd.attributes['http.url'] |
| 94 | + data.properties['request.url'] = sd.attributes['http.url'] |
84 | 95 | if 'http.status_code' in sd.attributes: |
85 | 96 | status_code = sd.attributes['http.status_code'] |
86 | 97 | data.responseCode = str(status_code) |
87 | 98 | data.success = ( |
88 | 99 | status_code >= 200 and status_code <= 399 |
89 | 100 | ) |
| 101 | + elif sd.status.code == 0: |
| 102 | + data.success = True |
90 | 103 | else: |
91 | 104 | envelope.name = \ |
92 | 105 | 'Microsoft.ApplicationInsights.RemoteDependency' |
93 | 106 | data = RemoteDependency( |
94 | 107 | name=sd.name, # TODO |
95 | | - id='|{}.{}.'.format(sd.context.trace_id, sd.span_id), |
96 | | - resultCode='0', # TODO |
| 108 | + id='{}'.format(sd.span_id), |
| 109 | + resultCode=str(sd.status.code), |
97 | 110 | duration=utils.timestamp_to_duration( |
98 | 111 | sd.start_time, |
99 | 112 | sd.end_time, |
100 | 113 | ), |
101 | | - success=True, # TODO |
| 114 | + success=False, # Modify based off attributes or status |
102 | 115 | properties={}, |
103 | 116 | ) |
104 | 117 | envelope.data = Data( |
105 | 118 | baseData=data, |
106 | 119 | baseType='RemoteDependencyData', |
107 | 120 | ) |
108 | 121 | if sd.span_kind == SpanKind.CLIENT: |
109 | | - data.type = 'HTTP' # TODO |
| 122 | + data.type = sd.attributes.get('component') |
110 | 123 | if 'http.url' in sd.attributes: |
111 | 124 | url = sd.attributes['http.url'] |
112 | 125 | # TODO: error handling, probably put scheme as well |
113 | | - data.name = utils.url_to_dependency_name(url) |
| 126 | + data.data = url |
| 127 | + parse_url = urlparse(url) |
| 128 | + # target matches authority (host:port) |
| 129 | + data.target = parse_url.netloc |
| 130 | + if 'http.method' in sd.attributes: |
| 131 | + # name is METHOD/path |
| 132 | + data.name = sd.attributes['http.method'] \ |
| 133 | + + ' ' + parse_url.path |
114 | 134 | if 'http.status_code' in sd.attributes: |
115 | | - data.resultCode = str(sd.attributes['http.status_code']) |
| 135 | + status_code = sd.attributes["http.status_code"] |
| 136 | + data.resultCode = str(status_code) |
| 137 | + data.success = 200 <= status_code < 400 |
| 138 | + elif sd.status.code == 0: |
| 139 | + data.success = True |
116 | 140 | else: |
117 | 141 | data.type = 'INPROC' |
| 142 | + data.success = True |
118 | 143 | # TODO: links, tracestate, tags |
119 | 144 | for key in sd.attributes: |
120 | 145 | # This removes redundant data from ApplicationInsights |
|
0 commit comments