def test_copy_endpoint_with_new_service_name(gethostbyname): gethostbyname.return_value = "0.0.0.0" endpoint = thrift.create_endpoint(port=8080, service_name="foo") new_endpoint = thrift.copy_endpoint_with_new_service_name( endpoint, "blargh") assert new_endpoint.port == 8080 assert new_endpoint.service_name == "blargh" # An IP address of 0.0.0.0 unpacks to just 0 assert endpoint.ipv4 == 0
def test_copy_endpoint_with_new_service_name(gethostbyname): gethostbyname.return_value = '0.0.0.0' endpoint = thrift.create_endpoint( port=8080, service_name='foo', ) new_endpoint = thrift.copy_endpoint_with_new_service_name( endpoint, 'blargh') assert new_endpoint.port == 8080 assert new_endpoint.service_name == 'blargh' # An IP address of 0.0.0.0 unpacks to just 0 assert endpoint.ipv4 == 0
def log_spans(self): """Main function to log all the annotations stored during the entire request. This is done if the request is sampled and the response was a success. It also logs the service `ss` and `sr` annotations. """ if self.zipkin_attrs.is_sampled: # Collect additional annotations from the logging handler annotations_by_span_id = defaultdict(dict) binary_annotations_by_span_id = defaultdict(dict) for msg in self.log_handler.extra_annotations: span_id = msg['parent_span_id'] or self.zipkin_attrs.span_id # This should check if these are non-None annotations_by_span_id[span_id].update(msg['annotations']) binary_annotations_by_span_id[span_id].update( msg['binary_annotations']) # Collect, annotate, and log client spans from the logging handler for span in self.log_handler.client_spans: # The parent_span_id is either the parent ID set in the # logging handler or the current Zipkin context's span ID. parent_span_id = (span['parent_span_id'] or self.zipkin_attrs.span_id) # A new client span's span ID can be overridden span_id = span['span_id'] or generate_random_64bit_string() endpoint = copy_endpoint_with_new_service_name( self.thrift_endpoint, span['service_name']) # Collect annotations both logged with the new spans and # logged in separate log messages. annotations = span['annotations'] annotations.update(annotations_by_span_id[span_id]) binary_annotations = span['binary_annotations'] binary_annotations.update( binary_annotations_by_span_id[span_id]) # Create serializable thrift objects of annotations thrift_annotations = annotation_list_builder( annotations, endpoint) thrift_binary_annotations = binary_annotation_list_builder( binary_annotations, endpoint) print("logging_helper:1") log_span( span_id=span_id, parent_span_id=parent_span_id, trace_id=self.zipkin_attrs.trace_id, span_name=span['span_name'], annotations=thrift_annotations, binary_annotations=thrift_binary_annotations, transport_handler=self.transport_handler, ) # Collect extra annotations for server span, then log it. extra_annotations = annotations_by_span_id[ self.zipkin_attrs.span_id] extra_binary_annotations = binary_annotations_by_span_id[ self.zipkin_attrs.span_id] annotations = dict(sr=self.start_timestamp, ss=self.end_timestamp, **extra_annotations) """ FIXME sunyan: disable it! if self.add_logging_annotation: annotations[LOGGING_START_KEY] = logging_start """ thrift_annotations = annotation_list_builder( annotations, self.thrift_endpoint, ) # Binary annotations can be set through debug messages or the # set_extra_binary_annotations registry setting. self.binary_annotations_dict.update(extra_binary_annotations) thrift_binary_annotations = binary_annotation_list_builder( self.binary_annotations_dict, self.thrift_endpoint, ) print("logging_helper:2") log_span( span_id=self.zipkin_attrs.span_id, parent_span_id=self.zipkin_attrs.parent_span_id, trace_id=self.zipkin_attrs.trace_id, span_name=self.span_name, annotations=thrift_annotations, binary_annotations=thrift_binary_annotations, transport_handler=self.transport_handler, )
def log_spans(self): """Main function to log all the annotations stored during the entire request. This is done if the request is sampled and the response was a success. It also logs the service (`ss` and `sr`) or the client ('cs' and 'cr') annotations. """ if self.zipkin_attrs.is_sampled: end_timestamp = time.time() # Collect additional annotations from the logging handler annotations_by_span_id = defaultdict(dict) binary_annotations_by_span_id = defaultdict(dict) for msg in self.log_handler.extra_annotations: span_id = msg['parent_span_id'] or self.zipkin_attrs.span_id # This should check if these are non-None annotations_by_span_id[span_id].update(msg['annotations']) binary_annotations_by_span_id[span_id].update( msg['binary_annotations']) # Collect, annotate, and log client spans from the logging handler for span in self.log_handler.client_spans: # The parent_span_id is either the parent ID set in the # logging handler or the current Zipkin context's span ID. parent_span_id = (span['parent_span_id'] or self.zipkin_attrs.span_id) # A new client span's span ID can be overridden span_id = span['span_id'] or generate_random_64bit_string() endpoint = copy_endpoint_with_new_service_name( self.thrift_endpoint, span['service_name']) # Collect annotations both logged with the new spans and # logged in separate log messages. annotations = span['annotations'] annotations.update(annotations_by_span_id[span_id]) binary_annotations = span['binary_annotations'] binary_annotations.update( binary_annotations_by_span_id[span_id]) timestamp, duration = get_local_span_timestamp_and_duration( annotations) # Create serializable thrift objects of annotations thrift_annotations = annotation_list_builder( annotations, endpoint) thrift_binary_annotations = binary_annotation_list_builder( binary_annotations, endpoint) if span.get('sa_binary_annotations'): thrift_binary_annotations += span['sa_binary_annotations'] log_span( span_id=span_id, parent_span_id=parent_span_id, trace_id=self.zipkin_attrs.trace_id, span_name=span['span_name'], annotations=thrift_annotations, binary_annotations=thrift_binary_annotations, transport_handler=self.transport_handler, timestamp_s=timestamp, duration_s=duration, ) extra_annotations = annotations_by_span_id[ self.zipkin_attrs.span_id] extra_binary_annotations = binary_annotations_by_span_id[ self.zipkin_attrs.span_id] k1, k2 = ('sr', 'ss') if self.client_context: k1, k2 = ('cs', 'cr') annotations = {k1: self.start_timestamp, k2: end_timestamp} annotations.update(extra_annotations) if self.add_logging_annotation: annotations[LOGGING_END_KEY] = time.time() thrift_annotations = annotation_list_builder( annotations, self.thrift_endpoint, ) # Binary annotations can be set through debug messages or the # set_extra_binary_annotations registry setting. self.binary_annotations_dict.update(extra_binary_annotations) thrift_binary_annotations = binary_annotation_list_builder( self.binary_annotations_dict, self.thrift_endpoint, ) if self.sa_binary_annotations: thrift_binary_annotations += self.sa_binary_annotations if self.report_root_timestamp: timestamp = self.start_timestamp duration = end_timestamp - self.start_timestamp else: timestamp = duration = None log_span( span_id=self.zipkin_attrs.span_id, parent_span_id=self.zipkin_attrs.parent_span_id, trace_id=self.zipkin_attrs.trace_id, span_name=self.span_name, annotations=thrift_annotations, binary_annotations=thrift_binary_annotations, timestamp_s=timestamp, duration_s=duration, transport_handler=self.transport_handler, )