def test_get_runtime_id_double_fork(): runtime_id = runtime.get_runtime_id() child = os.fork() if child == 0: runtime_id_child = runtime.get_runtime_id() assert runtime_id != runtime_id_child child2 = os.fork() if child2 == 0: runtime_id_child2 = runtime.get_runtime_id() assert runtime_id != runtime_id_child assert runtime_id_child != runtime_id_child2 os._exit(42) pid, status = os.waitpid(child2, 0) exit_code = os.WEXITSTATUS(status) assert exit_code == 42 os._exit(42) pid, status = os.waitpid(child, 0) exit_code = os.WEXITSTATUS(status) assert exit_code == 42
def export( self, events, # type: recorder.EventsType start_time_ns, # type: int end_time_ns, # type: int ): # type: (...) -> pprof.pprof_ProfileType """Export events to an HTTP endpoint. :param events: The event dictionary from a `ddtrace.profiling.recorder.Recorder`. :param start_time_ns: The start time of recording. :param end_time_ns: The end time of recording. """ if self.api_key: headers = { "DD-API-KEY": self.api_key.encode(), } else: headers = {} if self._container_info and self._container_info.container_id: headers["Datadog-Container-Id"] = self._container_info.container_id profile = super(PprofHTTPExporter, self).export(events, start_time_ns, end_time_ns) s = six.BytesIO() with gzip.GzipFile(fileobj=s, mode="wb") as gz: gz.write(profile.SerializeToString()) fields = { "runtime-id": runtime.get_runtime_id().encode("ascii"), "recording-start": (datetime.datetime.utcfromtimestamp( start_time_ns / 1e9).replace(microsecond=0).isoformat() + "Z").encode(), "recording-end": (datetime.datetime.utcfromtimestamp( end_time_ns / 1e9).replace(microsecond=0).isoformat() + "Z").encode(), "runtime": PYTHON_IMPLEMENTATION, "format": b"pprof", "type": b"cpu+alloc+exceptions", "chunk-data": s.getvalue(), } service = self.service or os.path.basename( profile.string_table[profile.mapping[0].filename]) content_type, body = self._encode_multipart_formdata( fields, tags=self._get_tags(service), ) headers["Content-Type"] = content_type client = agent.get_connection(self.endpoint, self.timeout) self._upload(client, self.endpoint_path, body, headers) return profile
def _get_tags(self, service): tags = { "service": service.encode("utf-8"), "runtime-id": runtime.get_runtime_id().encode("ascii"), } tags.update(self.tags) return tags
def export(self, events, start_time_ns, end_time_ns): """Export events to an HTTP endpoint. :param events: The event dictionary from a `ddtrace.profiling.recorder.Recorder`. :param start_time_ns: The start time of recording. :param end_time_ns: The end time of recording. """ if self.api_key: headers = { "DD-API-KEY": self.api_key.encode(), } else: headers = {} if self._container_info and self._container_info.container_id: headers["Datadog-Container-Id"] = self._container_info.container_id profile = super(PprofHTTPExporter, self).export(events, start_time_ns, end_time_ns) s = six.BytesIO() with gzip.GzipFile(fileobj=s, mode="wb") as gz: gz.write(profile.SerializeToString()) fields = { "runtime-id": runtime.get_runtime_id().encode("ascii"), "recording-start": ( datetime.datetime.utcfromtimestamp(start_time_ns / 1e9).replace(microsecond=0).isoformat() + "Z" ).encode(), "recording-end": ( datetime.datetime.utcfromtimestamp(end_time_ns / 1e9).replace(microsecond=0).isoformat() + "Z" ).encode(), "runtime": PYTHON_IMPLEMENTATION, "format": b"pprof", "type": b"cpu+alloc+exceptions", "chunk-data": s.getvalue(), } service = self.service or os.path.basename(profile.string_table[profile.mapping[0].filename]) content_type, body = self._encode_multipart_formdata( fields, tags=self._get_tags(service), ) headers["Content-Type"] = content_type parsed = urlparse.urlparse(self.endpoint) if parsed.scheme == "https": client = http_client.HTTPSConnection(parsed.hostname, parsed.port, timeout=self.timeout) elif parsed.scheme == "http": client = http_client.HTTPConnection(parsed.hostname, parsed.port, timeout=self.timeout) elif parsed.scheme == "unix": client = uds.UDSHTTPConnection(parsed.path, False, parsed.hostname, parsed.port, timeout=self.timeout) else: raise ValueError("Unknown connection scheme %s" % parsed.scheme) self._upload(client, self.endpoint_path, body, headers)
def export(self, events, start_time_ns, end_time_ns): """Export events to an HTTP endpoint. :param events: The event dictionary from a `ddtrace.profiling.recorder.Recorder`. :param start_time_ns: The start time of recording. :param end_time_ns: The end time of recording. """ if not self.endpoint: raise InvalidEndpoint("Endpoint is empty") common_headers = { "DD-API-KEY": self.api_key.encode(), } profile = super(PprofHTTPExporter, self).export(events, start_time_ns, end_time_ns) s = six.BytesIO() with gzip.GzipFile(fileobj=s, mode="wb") as gz: gz.write(profile.SerializeToString()) fields = { "runtime-id": runtime.get_runtime_id().encode("ascii"), "recording-start": ( datetime.datetime.utcfromtimestamp(start_time_ns / 1e9).replace(microsecond=0).isoformat() + "Z" ).encode(), "recording-end": ( datetime.datetime.utcfromtimestamp(end_time_ns / 1e9).replace(microsecond=0).isoformat() + "Z" ).encode(), "runtime": PYTHON_IMPLEMENTATION, "format": b"pprof", "type": b"cpu+alloc+exceptions", "chunk-data": s.getvalue(), } service_name = self.service_name or os.path.basename(profile.string_table[profile.mapping[0].filename]) content_type, body = self._encode_multipart_formdata(fields, tags=self._get_tags(service_name),) headers = common_headers.copy() headers["Content-Type"] = content_type # urllib uses `POST` if `data` is supplied (Python 2 version does not handle `method` kwarg) req = request.Request(self.endpoint, data=body, headers=headers) retry = tenacity.Retrying( # Retry after 1s, 2s, 4s, 8s with some randomness wait=tenacity.wait_random_exponential(multiplier=0.5), stop=tenacity.stop_after_delay(self.max_retry_delay), retry=tenacity.retry_if_exception_type( (error.HTTPError, error.URLError, http_client.HTTPException, OSError, IOError) ), ) try: retry(request.urlopen, req, timeout=self.timeout) except tenacity.RetryError as e: raise UploadFailed(e.last_attempt.exception())
def _get_tags( self, service # type: str ): # type: (...) -> typing.Dict[str, bytes] tags = { "service": service.encode("utf-8"), "runtime-id": runtime.get_runtime_id().encode("ascii"), } tags.update(self.tags) return tags
def _get_tags(self, service): tags = { "service": service.encode("utf-8"), "runtime-id": runtime.get_runtime_id().encode("ascii"), } user_tags = parse_tags_str(os.environ.get("DD_TAGS", {})) user_tags.update( parse_tags_str(os.environ.get("DD_PROFILING_TAGS", {}))) tags.update({k: six.ensure_binary(v) for k, v in user_tags.items()}) tags.update({k: six.ensure_binary(v) for k, v in self.tags.items()}) if self.version: tags["version"] = self.version.encode("utf-8") if self.env: tags["env"] = self.env.encode("utf-8") return tags
def _get_tags(self, service): tags = { "service": service.encode("utf-8"), "host": HOSTNAME.encode("utf-8"), "runtime-id": runtime.get_runtime_id().encode("ascii"), "language": b"python", "runtime": PYTHON_IMPLEMENTATION, "runtime_version": PYTHON_VERSION, "profiler_version": ddtrace.__version__.encode("utf-8"), } if self.version: tags["version"] = self.version.encode("utf-8") if self.env: tags["env"] = self.env.encode("utf-8") user_tags = parse_tags_str(os.environ.get("DD_TAGS", {})) user_tags.update(parse_tags_str(os.environ.get("DD_PROFILING_TAGS", {}))) tags.update({k: six.ensure_binary(v) for k, v in user_tags.items()}) return tags
def test_get_runtime_id_fork(): runtime_id = runtime.get_runtime_id() assert isinstance(runtime_id, str) assert runtime_id == runtime.get_runtime_id() assert runtime_id == runtime.get_runtime_id() child = os.fork() if child == 0: runtime_id_child = runtime.get_runtime_id() assert isinstance(runtime_id_child, str) assert runtime_id != runtime_id_child assert runtime_id != runtime.get_runtime_id() assert runtime_id_child == runtime.get_runtime_id() assert runtime_id_child == runtime.get_runtime_id() os._exit(42) pid, status = os.waitpid(child, 0) exit_code = os.WEXITSTATUS(status) assert exit_code == 42
def test_get_runtime_id(): runtime_id = runtime.get_runtime_id() assert isinstance(runtime_id, str) assert runtime_id == runtime.get_runtime_id() assert runtime_id == runtime.get_runtime_id()