Skip to content

Commit

Permalink
Add proper length zero padding to hex strings of traceId, spanId, par…
Browse files Browse the repository at this point in the history
…entId sent on the wire

For compatibility with jaeger-collector
Fixes #907
  • Loading branch information
ecourreges-orange committed Jul 30, 2020
1 parent fc58032 commit c0f7044
Show file tree
Hide file tree
Showing 31 changed files with 112 additions and 59 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
from time import sleep
from typing import Sequence as TypingSequence

from backoff import expo
from google.rpc.error_details_pb2 import RetryInfo
from grpc import (
ChannelCredentials,
Expand All @@ -29,6 +28,7 @@
secure_channel,
)

from backoff import expo
from opentelemetry.proto.collector.trace.v1.trace_service_pb2 import (
ExportTraceServiceRequest,
)
Expand Down
4 changes: 3 additions & 1 deletion exporter/opentelemetry-exporter-zipkin/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

- Change package name to opentelemetry-exporter-zipkin
([#953](https://github.com/open-telemetry/opentelemetry-python/pull/953))
Add proper length zero padding to hex strings of traceId, spanId, parentId sent on the wire, for compatibility with jaeger-collector
([#908](https://github.com/open-telemetry/opentelemetry-python/pull/908))

## 0.8b0

Expand All @@ -23,4 +25,4 @@ Released 2020-05-12

Released 2020-02-21

- Initial release
- Initial release
Original file line number Diff line number Diff line change
Expand Up @@ -168,8 +168,9 @@ def _translate_to_zipkin(self, spans: Sequence[Span]):
duration_mus = _nsec_to_usec_round(span.end_time - span.start_time)

zipkin_span = {
"traceId": format(trace_id, "x"),
"id": format(span_id, "x"),
# Ensure left-zero-padding of traceId, spanId, parentId
"traceId": format(trace_id, "032x"),
"id": format(span_id, "016x"),
"name": span.name,
"timestamp": start_timestamp_mus,
"duration": duration_mus,
Expand All @@ -184,10 +185,10 @@ def _translate_to_zipkin(self, spans: Sequence[Span]):

if isinstance(span.parent, Span):
zipkin_span["parentId"] = format(
span.parent.get_context().span_id, "x"
span.parent.get_context().span_id, "016x"
)
elif isinstance(span.parent, SpanContext):
zipkin_span["parentId"] = format(span.parent.span_id, "x")
zipkin_span["parentId"] = format(span.parent.span_id, "016x")

zipkin_spans.append(zipkin_span)
return zipkin_spans
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -264,6 +264,72 @@ def test_export(self):
headers={"Content-Type": "application/json"},
)

# pylint: disable=too-many-locals
def test_zero_padding(self):
"""test that hex ids starting with 0
are properly padded to 16 or 32 hex chars
when exported
"""

span_names = "testZeroes"
trace_id = 0x0E0C63257DE34C926F9EFCD03927272E
span_id = 0x04BF92DEEFC58C92
parent_id = 0x0AAAAAAAAAAAAAAA

start_time = 683647322 * 10 ** 9 # in ns
duration = 50 * 10 ** 6
end_time = start_time + duration

span_context = trace_api.SpanContext(
trace_id,
span_id,
is_remote=False,
trace_flags=TraceFlags(TraceFlags.SAMPLED),
)
parent_context = trace_api.SpanContext(
trace_id, parent_id, is_remote=False
)

otel_span = trace.Span(
name=span_names[0], context=span_context, parent=parent_context,
)

otel_span.start(start_time=start_time)
otel_span.end(end_time=end_time)

service_name = "test-service"
local_endpoint = {"serviceName": service_name, "port": 9411}

exporter = ZipkinSpanExporter(service_name)
# Check traceId are properly lowercase 16 or 32 hex
expected = [
{
"traceId": "0e0c63257de34c926f9efcd03927272e",
"id": "04bf92deefc58c92",
"name": span_names[0],
"timestamp": start_time // 10 ** 3,
"duration": duration // 10 ** 3,
"localEndpoint": local_endpoint,
"kind": None,
"tags": {},
"annotations": None,
"debug": True,
"parentId": "0aaaaaaaaaaaaaaa",
}
]

mock_post = MagicMock()
with patch("requests.post", mock_post):
mock_post.return_value = MockResponse(200)
status = exporter.export([otel_span])
self.assertEqual(SpanExportResult.SUCCESS, status)

mock_post.assert_called_with(
url="http://localhost:9411/api/v2/spans",
data=json.dumps(expected),
headers={"Content-Type": "application/json"},
)

@patch("requests.post")
def test_invalid_response(self, mock_post):
mock_post.return_value = MockResponse(404)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,10 @@
---
"""

import asyncpg
import wrapt
from asyncpg import exceptions

import asyncpg
from asyncpg import exceptions
from opentelemetry import trace
from opentelemetry.ext.asyncpg.version import __version__
from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import asyncpg
from asyncpg import Connection

from opentelemetry.ext.asyncpg import AsyncPGInstrumentor
from opentelemetry.test.test_base import TestBase

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,9 @@
import logging
from inspect import currentframe

from boto.connection import AWSAuthConnection, AWSQueryConnection
from wrapt import wrap_function_wrapper

from boto.connection import AWSAuthConnection, AWSQueryConnection
from opentelemetry.ext.boto.version import __version__
from opentelemetry.ext.botocore import add_span_arg_tags, unwrap
from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@
mock_s3_deprecated,
mock_sts_deprecated,
)

from opentelemetry.ext.boto import BotoInstrumentor
from opentelemetry.sdk.resources import Resource
from opentelemetry.test.test_base import TestBase
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,9 @@

import logging

from botocore.client import BaseClient
from wrapt import ObjectProxy, wrap_function_wrapper

from botocore.client import BaseClient
from opentelemetry.ext.botocore.version import __version__
from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
from opentelemetry.sdk.trace import Resource
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
mock_s3,
mock_sqs,
)

from opentelemetry.ext.botocore import BotocoreInstrumentor
from opentelemetry.sdk.resources import Resource
from opentelemetry.test.test_base import TestBase
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,6 @@ def add(x, y):
import signal

from celery import signals # pylint: disable=no-name-in-module

from opentelemetry import trace
from opentelemetry.ext.celery import utils
from opentelemetry.ext.celery.version import __version__
Expand Down
1 change: 0 additions & 1 deletion ext/opentelemetry-ext-celery/tests/test_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
from unittest import mock

from celery import Celery

from opentelemetry import trace as trace_api
from opentelemetry.ext.celery import utils
from opentelemetry.sdk import trace
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
import os

import asyncpg

from opentelemetry.ext.asyncpg import AsyncPGInstrumentor
from opentelemetry.test.test_base import TestBase
from opentelemetry.trace.status import StatusCanonicalCode
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,12 @@

import time

import celery
import pytest
from celery import signals
from celery.exceptions import Retry

import celery
import opentelemetry.ext.celery
from celery import signals
from celery.exceptions import Retry
from opentelemetry import trace as trace_api
from opentelemetry.ext.celery import CeleryInstrumentor
from opentelemetry.sdk import resources
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,10 @@
import os
import time

import aiopg
import psycopg2
import pytest

import aiopg
from opentelemetry import trace as trace_api
from opentelemetry.instrumentation.aiopg import AiopgInstrumentor
from opentelemetry.test.test_base import TestBase
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,11 +54,11 @@
from logging import getLogger
from os import environ

import elasticsearch
import elasticsearch.exceptions
from wrapt import ObjectProxy
from wrapt import wrap_function_wrapper as _wrap

import elasticsearch
import elasticsearch.exceptions
from opentelemetry import context, propagators, trace
from opentelemetry.ext.elasticsearch.version import __version__
from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,9 @@

import elasticsearch
import elasticsearch.exceptions
import opentelemetry.ext.elasticsearch
from elasticsearch import Elasticsearch
from elasticsearch_dsl import Search

import opentelemetry.ext.elasticsearch
from opentelemetry.ext.elasticsearch import ElasticsearchInstrumentor
from opentelemetry.test.test_base import TestBase
from opentelemetry.trace.status import StatusCanonicalCode
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,10 +40,10 @@

import logging

import pymemcache
from wrapt import ObjectProxy
from wrapt import wrap_function_wrapper as _wrap

import pymemcache
from opentelemetry.ext.pymemcache.version import __version__
from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
from opentelemetry.instrumentation.utils import unwrap
Expand Down
11 changes: 5 additions & 6 deletions ext/opentelemetry-ext-pymemcache/tests/test_pymemcache.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,11 @@
# limitations under the License.

import pymemcache
from opentelemetry import trace as trace_api
from opentelemetry.ext.pymemcache import PymemcacheInstrumentor
from opentelemetry.test.test_base import TestBase
from opentelemetry.trace import get_tracer
from opentelemetry.trace.status import StatusCanonicalCode
from pymemcache.exceptions import (
MemcacheClientError,
MemcacheIllegalInputError,
Expand All @@ -21,12 +26,6 @@
MemcacheUnknownError,
)

from opentelemetry import trace as trace_api
from opentelemetry.ext.pymemcache import PymemcacheInstrumentor
from opentelemetry.test.test_base import TestBase
from opentelemetry.trace import get_tracer
from opentelemetry.trace.status import StatusCanonicalCode

from .utils import MockSocket, _str

TEST_HOST = "localhost"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,9 +80,6 @@

import typing

from pyramid.config import Configurator
from pyramid.path import caller_package
from pyramid.settings import aslist
from wrapt import ObjectProxy
from wrapt import wrap_function_wrapper as _wrap

Expand All @@ -95,6 +92,9 @@
from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
from opentelemetry.instrumentation.utils import unwrap
from opentelemetry.trace import TracerProvider, get_tracer
from pyramid.config import Configurator
from pyramid.path import caller_package
from pyramid.settings import aslist


def _traced_init(wrapped, instance, args, kwargs):
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
from logging import getLogger

from pyramid.events import BeforeTraversal
from pyramid.httpexceptions import HTTPException
from pyramid.settings import asbool
from pyramid.tweens import EXCVIEW

import opentelemetry.ext.wsgi as otel_wsgi
from opentelemetry import configuration, context, propagators, trace
from opentelemetry.ext.pyramid.version import __version__
from opentelemetry.util import ExcludeList, time_ns
from pyramid.events import BeforeTraversal
from pyramid.httpexceptions import HTTPException
from pyramid.settings import asbool
from pyramid.tweens import EXCVIEW

TWEEN_NAME = "opentelemetry.ext.pyramid.trace_tween_factory"
SETTING_TRACE_ENABLED = "opentelemetry-pyramid.trace_enabled"
Expand Down
4 changes: 2 additions & 2 deletions ext/opentelemetry-ext-pyramid/tests/pyramid_base_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,12 @@
# See the License for the specific language governing permissions and
# limitations under the License.

import pyramid.httpexceptions as exc
from pyramid.response import Response
from werkzeug.test import Client
from werkzeug.wrappers import BaseResponse

import pyramid.httpexceptions as exc
from opentelemetry.configuration import Configuration
from pyramid.response import Response


class InstrumentationTest:
Expand Down
3 changes: 1 addition & 2 deletions ext/opentelemetry-ext-pyramid/tests/test_automatic.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,10 @@
# See the License for the specific language governing permissions and
# limitations under the License.

from pyramid.config import Configurator

from opentelemetry.ext.pyramid import PyramidInstrumentor
from opentelemetry.test.test_base import TestBase
from opentelemetry.test.wsgitestutil import WsgiTestBase
from pyramid.config import Configurator

# pylint: disable=import-error
from .pyramid_base_test import InstrumentationTest
Expand Down
3 changes: 1 addition & 2 deletions ext/opentelemetry-ext-pyramid/tests/test_programmatic.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,12 @@

from unittest.mock import patch

from pyramid.config import Configurator

from opentelemetry import trace
from opentelemetry.ext.pyramid import PyramidInstrumentor
from opentelemetry.test.test_base import TestBase
from opentelemetry.test.wsgitestutil import WsgiTestBase
from opentelemetry.util import ExcludeList
from pyramid.config import Configurator

# pylint: disable=import-error
from .pyramid_base_test import InstrumentationTest
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import typing

import wrapt
from aiopg.utils import _ContextManager, _PoolAcquireContextManager

from aiopg.utils import _ContextManager, _PoolAcquireContextManager
from opentelemetry.ext.dbapi import DatabaseApiIntegration, TracedCursor
from opentelemetry.trace import SpanKind
from opentelemetry.trace.status import Status, StatusCanonicalCode
Expand Down
Loading

0 comments on commit c0f7044

Please sign in to comment.