Skip to content
This repository was archived by the owner on Mar 6, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
b13ad47
testing first trace export
aravinsiva Aug 1, 2020
cacea7c
instrumention client.py
aravinsiva Aug 3, 2020
63e9581
instrumenting job.py and adding documentation
aravinsiva Aug 4, 2020
719ed83
reconfiguring imports
aravinsiva Aug 4, 2020
72f22b6
quick cleanup of unused variable
aravinsiva Aug 5, 2020
ff8171f
adding more attributes in module and limiting complexity of instrumen…
aravinsiva Aug 7, 2020
456b445
adding tests, nox and correct attribute additions in client & job
aravinsiva Aug 9, 2020
f4aba6d
adding tests, nox and correct attribute additions in client & job (le…
aravinsiva Aug 9, 2020
e223657
linting
aravinsiva Aug 9, 2020
78b8298
reformatting noxfile.[y
aravinsiva Aug 9, 2020
88b1a57
Merge branch 'master' into opentelemetry-tracing
aravinsiva Aug 9, 2020
e0895c9
Merge branch 'master' into opentelemetry-tracing
aravinsiva Aug 10, 2020
95a35ad
addressing suggested changes
aravinsiva Aug 11, 2020
3bf4574
Merge branch 'opentelemetry-tracing' of https://github.com/aravinsiva…
aravinsiva Aug 11, 2020
4dbb692
adding suggested changes
aravinsiva Aug 12, 2020
406f61a
removing print statements
aravinsiva Aug 12, 2020
c2b9add
setting same version across all OT [ackages and other reccommended ch…
aravinsiva Aug 12, 2020
d425909
suggested changes
aravinsiva Aug 12, 2020
64ec5fd
fixing packages issue in nox and updating documentation
aravinsiva Aug 13, 2020
73230dc
fixing module install issue
aravinsiva Aug 13, 2020
ae04fc6
restructuring design for testing adding first layer of tests (some st…
aravinsiva Aug 14, 2020
ac56488
adding reamining client tests and all job tests
aravinsiva Aug 15, 2020
d4de926
fixing linting issues
aravinsiva Aug 15, 2020
2d8aeb3
Merge branch 'master' into opentelemetry-tracing
tswast Aug 17, 2020
cd8e303
fixing trace not defined issue
aravinsiva Aug 17, 2020
d8c601d
fixing lint issues
aravinsiva Aug 17, 2020
2bcd106
fixing documentation issues and python2 testing issue
aravinsiva Aug 17, 2020
f1de589
linting and fixing coverage issues
aravinsiva Aug 18, 2020
72a77d1
Merge branch 'master' into opentelemetry-tracing
tswast Aug 18, 2020
0c7b354
adding suggested changes
aravinsiva Aug 18, 2020
51045f1
Merge branch 'opentelemetry-tracing' of https://github.com/aravinsiva…
aravinsiva Aug 18, 2020
ec96f5c
linting
aravinsiva Aug 18, 2020
35afadf
Merge branch 'master' into opentelemetry-tracing
aravinsiva Aug 18, 2020
5a32ad4
adding Shawn's suggested changes
aravinsiva Aug 19, 2020
1d7155c
Merge branch 'opentelemetry-tracing' of https://github.com/aravinsiva…
aravinsiva Aug 19, 2020
54c133a
fixing _default_span_attribute_bug
aravinsiva Aug 19, 2020
3aff14d
reverting uneccesxsary changes
aravinsiva Aug 19, 2020
59477ff
adding more tests for all job_ref parameters
aravinsiva Aug 19, 2020
0d15998
removing dependecny, ordering imports and other changes
aravinsiva Aug 20, 2020
d997175
addressing Shawn concerns
aravinsiva Aug 20, 2020
61b5b85
adding test and suggested changes
aravinsiva Aug 20, 2020
4d1dec1
adding opentelemetry to setup.py and other suggested changes
aravinsiva Aug 20, 2020
7704975
adding reasoning for not adding to [all]
aravinsiva Aug 20, 2020
839cd92
linting
aravinsiva Aug 20, 2020
55c322e
adding nested functions
aravinsiva Aug 21, 2020
4f66ffb
adding test
aravinsiva Aug 21, 2020
dd1e246
adding Tim suggested changes
aravinsiva Aug 21, 2020
5b3a202
adding full tests
aravinsiva Aug 22, 2020
9757812
Merge branch 'opentelemetry-tracing' of https://github.com/aravinsiva…
aravinsiva Aug 22, 2020
b0ac6eb
Merge pull request #1 from aravinsiva/adding_telemetry_to_non_api_calls
aravinsiva Aug 22, 2020
c75f827
Merge branch 'opentelemetry-tracing' of https://github.com/aravinsiva…
aravinsiva Aug 22, 2020
745775e
Merge branch 'master' of https://github.com/aravinsiva/python-bigquer…
aravinsiva Aug 24, 2020
9e087ff
linting and fixing missing test
aravinsiva Aug 24, 2020
d858ef5
Merge branch 'master' into adding_telemetry_to_non_api_calls
aravinsiva Aug 24, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
fixing documentation issues and python2 testing issue
  • Loading branch information
aravinsiva committed Aug 17, 2020
commit 2bcd106876db8b552b274b94d9497ea5c98f8cd7
36 changes: 17 additions & 19 deletions google/cloud/bigquery/opentelemetry_tracing.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,32 +34,13 @@

HAS_OPENTELEMETRY = False


_default_attributes = {
"db.system": "BigQuery",
}


@contextmanager
def create_span(name, attributes=None, client=None, job_ref=None):
# yield new span value
if not HAS_OPENTELEMETRY:
yield None
return
tracer = trace.get_tracer(__name__)

final_attributes = _get_final_span_attributes(attributes, client, job_ref)
with tracer.start_as_current_span(name=name, attributes=final_attributes) as span:
try:
yield span
span.set_status(Status(http_status_to_canonical_code(200)))
except GoogleAPICallError as error:
if error.code is not None:
span.set_status(Status(http_status_to_canonical_code(error.code)))
raise


def _get_final_span_attributes(attributes=None, client=None, job_ref=None):
"""Creates a ContextManager for a Span to be exported to the configured exporter. If no configuration
exists yields None.

Expand All @@ -83,7 +64,24 @@ def _get_final_span_attributes(attributes=None, client=None, job_ref=None):
Raised if a span could not be yielded or issue with call to
OpenTelemetry.
"""
final_attributes = _get_final_span_attributes(attributes, client, job_ref)
if not HAS_OPENTELEMETRY:
yield None
return
tracer = trace.get_tracer(__name__)

# yield new span value
with tracer.start_as_current_span(name=name, attributes=final_attributes) as span:
try:
yield span
span.set_status(Status(http_status_to_canonical_code(200)))
except GoogleAPICallError as error:
if error.code is not None:
span.set_status(Status(http_status_to_canonical_code(error.code)))
raise


def _get_final_span_attributes(attributes=None, client=None, job_ref=None):
if client:
client_attributes = _set_client_attributes(client)
_default_attributes.update(client_attributes)
Expand Down
2 changes: 1 addition & 1 deletion noxfile.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ def default(session):
"""
# Install all test dependencies, then install local packages in-place.
session.install(
"mock", "pytest", "google-cloud-testutils", "pytest-cov", "freezegun",
"mock", "pytest", "google-cloud-testutils", "pytest-cov", "freezegun"
)
session.install("grpcio")

Expand Down
91 changes: 44 additions & 47 deletions tests/unit/test_opentelemetry_tracing.py
Original file line number Diff line number Diff line change
@@ -1,20 +1,26 @@
import sys
import pytest

from importlib import reload
import mock

from google.cloud.bigquery import opentelemetry_tracing, client

from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import SimpleExportSpanProcessor
from opentelemetry.sdk.trace.export.in_memory_span_exporter import InMemorySpanExporter
try:
import opentelemetry
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import SimpleExportSpanProcessor
from opentelemetry.sdk.trace.export.in_memory_span_exporter import InMemorySpanExporter
except ImportError:
opentelemetry = None

from six.moves import reload_module

TEST_SPAN_NAME = "bar"
TEST_SPAN_ATTRIBUTES = {"foo": "baz"}


@pytest.mark.skipif(opentelemetry is None, reason="Require `opentelemetry`")
@pytest.fixture
def setup():
tracer_provider = TracerProvider()
Expand All @@ -25,65 +31,51 @@ def setup():
yield memory_exporter


@pytest.mark.skipif(opentelemetry is None, reason="Require `opentelemetry`")
def test_opentelemetry_not_installed(setup):
temp_module = sys.modules["opentelemetry"]
sys.modules["opentelemetry"] = None
reload(opentelemetry_tracing)
reload_module(opentelemetry_tracing)
with opentelemetry_tracing.create_span("No-op for opentelemetry") as span:
assert span is None
sys.modules["opentelemetry"] = temp_module
reload(opentelemetry_tracing)
reload_module(opentelemetry_tracing)


@pytest.mark.skipif(opentelemetry is None, reason="Require `opentelemetry`")
def test_opentelemetry_success(setup):
expected_attributes = {"foo": "baz", "db.system": "BigQuery"}

with opentelemetry_tracing.create_span(
TEST_SPAN_NAME, attributes=TEST_SPAN_ATTRIBUTES,
TEST_SPAN_NAME, attributes=TEST_SPAN_ATTRIBUTES, client=None, job_ref=None
) as span:
if span is None:
span_list = setup.get_finished_spans()
assert len(span_list) == 1
assert span is not None
assert span.name == TEST_SPAN_NAME
assert span.attributes == expected_attributes


@pytest.mark.skipif(opentelemetry is None, reason="Require `opentelemetry`")
def test_default_client_attributes(setup):
import google.auth.credentials

mock_credentials = mock.Mock(spec=google.auth.credentials.Credentials)
test_client = client.Client(
project="test_project", credentials=mock_credentials, location="test_location"
)

expected_attributes = {
"foo": "baz",
"db.system": "BigQuery",
"db.name": "test_project",
"location": "test_location",
}
with opentelemetry_tracing.create_span(
TEST_SPAN_NAME, attributes=TEST_SPAN_ATTRIBUTES, client=test_client
) as span:
if span is None:
span_list = setup.get_finished_spans()
assert len(span_list) == 1
assert span.name == TEST_SPAN_NAME
assert span.attributes == expected_attributes


with mock.patch('google.cloud.bigquery.client.Client') as test_client:
test_client.project = 'test_project'
test_client.location = 'test_location'
with opentelemetry_tracing.create_span(
TEST_SPAN_NAME, attributes=TEST_SPAN_ATTRIBUTES, client=test_client
) as span:
assert span is not None
assert span.name == TEST_SPAN_NAME
assert span.attributes == expected_attributes


@pytest.mark.skipif(opentelemetry is None, reason="Require `opentelemetry`")
def test_default_job_attributes(setup):
from google.cloud.bigquery import job
import google.auth.credentials

mock_credentials = mock.Mock(spec=google.auth.credentials.Credentials)

test_job_reference = job._JobReference(
job_id="test_job_id", project="test_project_id", location="test_location"
)
test_client = client.Client(
project="test_project", credentials=mock_credentials, location="test_location"
)
test_job = job._AsyncJob(job_id=test_job_reference, client=test_client)

expected_attributes = {
"db.system": "BigQuery",
Expand All @@ -93,12 +85,17 @@ def test_default_job_attributes(setup):
"job_id": "test_job_id",
"foo": "baz",
}
with mock.patch('google.cloud.bigquery.job._AsyncJob') as test_job_ref:
test_job_ref.job_id = 'test_job_id'
test_job_ref.location = 'test_location'
test_job_ref.project = 'test_project_id'
test_job_ref.num_child_jobs = '0'

with opentelemetry_tracing.create_span(
TEST_SPAN_NAME, attributes=TEST_SPAN_ATTRIBUTES, job_ref=test_job_ref
) as span:
assert span is not None
assert span.name == TEST_SPAN_NAME
assert span.attributes == expected_attributes


with opentelemetry_tracing.create_span(
TEST_SPAN_NAME, attributes=TEST_SPAN_ATTRIBUTES, job_ref=test_job
) as span:
if span is None:
span_list = setup.get_finished_spans()
assert len(span_list) == 1
assert span.name == TEST_SPAN_NAME
assert span.attributes == expected_attributes