Skip to content

Commit bdb607b

Browse files
committed
Addressing feedback
moving the generate span / trace id methods back to API. no longer needed due to #235 moving test service to it's own module. modifying shell script to use bourne shell, using posix standard location
1 parent 059f740 commit bdb607b

File tree

11 files changed

+122
-77
lines changed

11 files changed

+122
-77
lines changed

examples/opentelemetry-example-app/tests/test_flask_example.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
from werkzeug.wrappers import BaseResponse
2121

2222
import opentelemetry_example_app.flask_example as flask_example
23-
from opentelemetry import trace
23+
from opentelemetry.sdk import trace
2424
from opentelemetry.sdk.context.propagation import b3_format
2525

2626

examples/trace/server.py

Lines changed: 2 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -54,27 +54,6 @@ def index():
5454
return "hello"
5555

5656

57-
@app.route("/verify-tracecontext", methods=["POST"])
58-
def verify_tracecontext():
59-
"""Upon reception of some payload, sends a request back to the designated url.
60-
61-
This route is designed to be testable with the w3c tracecontext server / client test.
62-
"""
63-
for action in flask.request.json:
64-
requests.post(
65-
url=action["url"],
66-
data=json.dumps(action["arguments"]),
67-
headers={
68-
"Accept": "application/json",
69-
"Content-Type": "application/json; charset=utf-8",
70-
},
71-
timeout=5.0,
72-
)
73-
return "hello"
74-
75-
7657
if __name__ == "__main__":
77-
try:
78-
app.run(debug=True)
79-
finally:
80-
span_processor.shutdown()
58+
app.run(debug=True)
59+
span_processor.shutdown()

ext/opentelemetry-ext-http-requests/src/opentelemetry/ext/http_requests/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ def instrumented_request(self, method, url, *args, **kwargs):
6565
path = "<URL parses to None>"
6666
path = parsed_url.path
6767

68-
with tracer.start_span(path, kind=SpanKind.CLIENT) as span:
68+
with tracer.start_as_current_span(path, kind=SpanKind.CLIENT) as span:
6969
span.set_attribute("component", "http")
7070
span.set_attribute("http.method", method.upper())
7171
span.set_attribute("http.url", url)

opentelemetry-api/src/opentelemetry/context/propagation/tracecontexthttptextformat.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,11 @@
3535

3636
_KEY_FORMAT = _KEY_WITHOUT_VENDOR_FORMAT + "|" + _KEY_WITH_VENDOR_FORMAT
3737
_VALUE_FORMAT = (
38-
r"[\x20-\x2b\x2d-\x3c\x3e-\x7e]{1,255}[\x21-\x2b\x2d-\x3c\x3e-\x7e]?"
38+
r"[\x20-\x2b\x2d-\x3c\x3e-\x7e]{0,255}[\x21-\x2b\x2d-\x3c\x3e-\x7e]"
3939
)
4040

4141
_DELIMITER_FORMAT = "[ \t]*,[ \t]*"
42-
_MEMBER_FORMAT = "({})(=)({})".format(_KEY_FORMAT, _VALUE_FORMAT)
42+
_MEMBER_FORMAT = "({})(=)({})[ \t]*".format(_KEY_FORMAT, _VALUE_FORMAT)
4343

4444
_DELIMITER_FORMAT_RE = re.compile(_DELIMITER_FORMAT)
4545
_MEMBER_FORMAT_RE = re.compile(_MEMBER_FORMAT)
@@ -68,25 +68,25 @@ def extract(
6868
header = get_from_carrier(carrier, cls._TRACEPARENT_HEADER_NAME)
6969

7070
if not header:
71-
return trace.generate_span_context()
71+
return trace.INVALID_SPAN_CONTEXT
7272

7373
match = re.search(cls._TRACEPARENT_HEADER_FORMAT_RE, header[0])
7474
if not match:
75-
return trace.generate_span_context()
75+
return trace.INVALID_SPAN_CONTEXT
7676

7777
version = match.group(1)
7878
trace_id = match.group(2)
7979
span_id = match.group(3)
8080
trace_options = match.group(4)
8181

8282
if trace_id == "0" * 32 or span_id == "0" * 16:
83-
return trace.generate_span_context()
83+
return trace.INVALID_SPAN_CONTEXT
8484

8585
if version == "00":
8686
if match.group(5):
87-
return trace.generate_span_context()
87+
return trace.INVALID_SPAN_CONTEXT
8888
if version == "ff":
89-
return trace.generate_span_context()
89+
return trace.INVALID_SPAN_CONTEXT
9090

9191
tracestate_headers = get_from_carrier(
9292
carrier, cls._TRACESTATE_HEADER_NAME

opentelemetry-api/src/opentelemetry/trace/__init__.py

Lines changed: 2 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -309,31 +309,6 @@ def format_span_id(span_id: int) -> str:
309309
return "0x{:016x}".format(span_id)
310310

311311

312-
def generate_span_id() -> int:
313-
"""Get a new random span ID.
314-
315-
Returns:
316-
A random 64-bit int for use as a span ID
317-
"""
318-
return random.getrandbits(64)
319-
320-
321-
def generate_trace_id() -> int:
322-
"""Get a new random trace ID.
323-
324-
Returns:
325-
A random 128-bit int for use as a trace ID
326-
"""
327-
return random.getrandbits(128)
328-
329-
330-
def generate_span_context() -> "SpanContext":
331-
"""Generate a valid SpanContext."""
332-
return SpanContext(
333-
trace_id=generate_trace_id(), span_id=generate_span_id()
334-
)
335-
336-
337312
class SpanContext:
338313
"""The state of a Span to propagate between processes.
339314
@@ -364,11 +339,11 @@ def __init__(
364339
self.trace_state = trace_state
365340

366341
def __repr__(self) -> str:
367-
return "{}(trace_id={}, span_id={}, trace_state={})".format(
342+
return "{}(trace_id={}, span_id={}, trace_state={!r})".format(
368343
type(self).__name__,
369344
format_trace_id(self.trace_id),
370345
format_span_id(self.span_id),
371-
repr(self.trace_state),
346+
self.trace_state,
372347
)
373348

374349
def is_valid(self) -> bool:

opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,22 @@ def set_status(self, status: trace_api.Status) -> None:
298298
self.status = status
299299

300300

301+
def generate_span_id() -> int:
302+
"""Get a new random span ID.
303+
Returns:
304+
A random 64-bit int for use as a span ID
305+
"""
306+
return random.getrandbits(64)
307+
308+
309+
def generate_trace_id() -> int:
310+
"""Get a new random trace ID.
311+
Returns:
312+
A random 128-bit int for use as a trace ID
313+
"""
314+
return random.getrandbits(128)
315+
316+
301317
class Tracer(trace_api.Tracer):
302318
"""See `opentelemetry.trace.Tracer`.
303319

opentelemetry-sdk/tests/context/propagation/test_b3_format.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,10 @@ class TestB3Format(unittest.TestCase):
3030
@classmethod
3131
def setUpClass(cls):
3232
cls.serialized_trace_id = b3_format.format_trace_id(
33-
trace_api.generate_trace_id()
33+
trace.generate_trace_id()
3434
)
3535
cls.serialized_span_id = b3_format.format_span_id(
36-
trace_api.generate_span_id()
36+
trace.generate_span_id()
3737
)
3838

3939
def test_extract_multi_header(self):

opentelemetry-sdk/tests/trace/test_trace.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -221,16 +221,16 @@ def test_span_members(self):
221221
tracer = trace.Tracer("test_span_members")
222222

223223
other_context1 = trace_api.SpanContext(
224-
trace_id=trace_api.generate_trace_id(),
225-
span_id=trace_api.generate_span_id(),
224+
trace_id=trace.generate_trace_id(),
225+
span_id=trace.generate_span_id(),
226226
)
227227
other_context2 = trace_api.SpanContext(
228-
trace_id=trace_api.generate_trace_id(),
229-
span_id=trace_api.generate_span_id(),
228+
trace_id=trace.generate_trace_id(),
229+
span_id=trace.generate_span_id(),
230230
)
231231
other_context3 = trace_api.SpanContext(
232-
trace_id=trace_api.generate_trace_id(),
233-
span_id=trace_api.generate_span_id(),
232+
trace_id=trace.generate_trace_id(),
233+
span_id=trace.generate_span_id(),
234234
)
235235

236236
self.assertIsNone(tracer.get_current_span())
@@ -362,8 +362,8 @@ def test_ended_span(self):
362362
tracer = trace.Tracer("test_ended_span")
363363

364364
other_context1 = trace_api.SpanContext(
365-
trace_id=trace_api.generate_trace_id(),
366-
span_id=trace_api.generate_span_id(),
365+
trace_id=trace.generate_trace_id(),
366+
span_id=trace.generate_span_id(),
367367
)
368368

369369
with tracer.start_as_current_span("root") as root:
Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
#!/bin/bash
2-
# set -e
1+
#!/bin/sh
2+
set -e
33
# hard-coding the git tag to ensure stable builds.
44
TRACECONTEXT_GIT_TAG="98f210efd89c63593dce90e2bae0a1bdcb986f51"
55
# clone w3c tracecontext tests
@@ -9,18 +9,18 @@ git clone https://github.com/w3c/trace-context ./target/trace-context
99
cd ./target/trace-context && git checkout $TRACECONTEXT_GIT_TAG && cd -
1010
# start example opentelemetry service, which propagates trace-context by
1111
# default.
12-
python ./examples/trace/server.py 1>&2 &
12+
python ./tests/w3c_tracecontext_validation_server.py 1>&2 &
1313
EXAMPLE_SERVER_PID=$!
1414
# give the app server a little time to start up. Not adding some sort
1515
# of delay would cause many of the tracecontext tests to fail being
1616
# unable to connect.
1717
sleep 1
18-
function on-shutdown {
18+
function onshutdown {
1919
# send a sigint, to ensure
2020
# it is caught as a KeyboardInterrupt in the
2121
# example service.
22-
kill -2 $EXAMPLE_SERVER_PID
22+
kill $EXAMPLE_SERVER_PID
2323
}
24-
trap on-shutdown EXIT
24+
trap onshutdown EXIT
2525
cd ./target/trace-context/test
2626
python test.py http://127.0.0.1:5000/verify-tracecontext
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
#!/usr/bin/env python3
2+
#
3+
# Copyright 2019, OpenTelemetry Authors
4+
#
5+
# Licensed under the Apache License, Version 2.0 (the "License");
6+
# you may not use this file except in compliance with the License.
7+
# You may obtain a copy of the License at
8+
#
9+
# http://www.apache.org/licenses/LICENSE-2.0
10+
#
11+
# Unless required by applicable law or agreed to in writing, software
12+
# distributed under the License is distributed on an "AS IS" BASIS,
13+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
# See the License for the specific language governing permissions and
15+
# limitations under the License.
16+
"""
17+
This server is intended to be used with the W3C tracecontext validation
18+
Service. It implements the APIs needed to be exercised by the test bed.
19+
"""
20+
21+
import json
22+
23+
import flask
24+
import requests
25+
26+
from opentelemetry import trace
27+
from opentelemetry.ext import http_requests
28+
from opentelemetry.ext.wsgi import OpenTelemetryMiddleware
29+
from opentelemetry.sdk.trace import Tracer
30+
from opentelemetry.sdk.trace.export import (
31+
ConsoleSpanExporter,
32+
SimpleExportSpanProcessor,
33+
)
34+
35+
# The preferred tracer implementation must be set, as the opentelemetry-api
36+
# defines the interface with a no-op implementation.
37+
trace.set_preferred_tracer_implementation(lambda T: Tracer())
38+
39+
# Integrations are the glue that binds the OpenTelemetry API and the
40+
# frameworks and libraries that are used together, automatically creating
41+
# Spans and propagating context as appropriate.
42+
http_requests.enable(trace.tracer())
43+
44+
# SpanExporter receives the spans and send them to the target location.
45+
span_processor = SimpleExportSpanProcessor(ConsoleSpanExporter())
46+
trace.tracer().add_span_processor(span_processor)
47+
48+
app = flask.Flask(__name__)
49+
app.wsgi_app = OpenTelemetryMiddleware(app.wsgi_app)
50+
51+
52+
@app.route("/verify-tracecontext", methods=["POST"])
53+
def verify_tracecontext():
54+
"""Upon reception of some payload, sends a request back to the designated url.
55+
56+
This route is designed to be testable with the w3c tracecontext server / client test.
57+
"""
58+
for action in flask.request.json:
59+
requests.post(
60+
url=action["url"],
61+
data=json.dumps(action["arguments"]),
62+
headers={
63+
"Accept": "application/json",
64+
"Content-Type": "application/json; charset=utf-8",
65+
},
66+
timeout=5.0,
67+
)
68+
return "hello"
69+
70+
71+
if __name__ == "__main__":
72+
try:
73+
app.run(debug=True)
74+
finally:
75+
span_processor.shutdown()

0 commit comments

Comments
 (0)