-
Notifications
You must be signed in to change notification settings - Fork 1.6k
Implemented trace library based on the autogen, gax only #3513
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
16 commits
Select commit
Hold shift + click to select a range
e63974e
Implemented trace library based on the autogen, gax only
liyanhui1228 661c463
Address Jon's comments, add support for nested spans.
liyanhui1228 f8574b0
Fix lint and modify nox.py
liyanhui1228 2b09170
Use the FromDatetime function to convert datetime to timestamp protobuf
liyanhui1228 3549f28
Add unit test for _gax.py and client.py
liyanhui1228 7ebb8ba
Add unit test skeleton for trace.py and trace_span.py
liyanhui1228 0bbd3d7
Fix stuff
liyanhui1228 95bd77b
Fix style
liyanhui1228 d5186f5
Fix stuff
liyanhui1228 da12264
Fix test coverage
liyanhui1228 6436717
Complete unit test for trace.py
liyanhui1228 9434b75
Complete unit test for trace_span.py
liyanhui1228 46171d4
Remove unused function
liyanhui1228 709b7dd
Modify tests
liyanhui1228 9162cf6
Change to use itertools to traverse spans
liyanhui1228 992c749
Fix style
liyanhui1228 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,11 @@ | ||
| [run] | ||
| branch = True | ||
|
|
||
| [report] | ||
| fail_under = 100 | ||
| show_missing = True | ||
| exclude_lines = | ||
| # Re-enable the standard pragma | ||
| pragma: NO COVER | ||
| # Ignore debug-only repr | ||
| def __repr__ |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,20 @@ | ||
| # Copyright 2017 Google Inc. | ||
| # | ||
| # Licensed under the Apache License, Version 2.0 (the "License"); | ||
| # you may not use this file except in compliance with the License. | ||
| # You may obtain a copy of the License at | ||
| # | ||
| # http://www.apache.org/licenses/LICENSE-2.0 | ||
| # | ||
| # Unless required by applicable law or agreed to in writing, software | ||
| # distributed under the License is distributed on an "AS IS" BASIS, | ||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| # See the License for the specific language governing permissions and | ||
| # limitations under the License. | ||
|
|
||
| from google.cloud.trace.client import Client | ||
| from google.cloud.trace.trace import Trace | ||
| from google.cloud.trace.trace_span import TraceSpan | ||
|
|
||
|
|
||
| __all__ = ['Client', 'Trace', 'TraceSpan'] |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,213 @@ | ||
| # Copyright 2017 Google Inc. | ||
| # | ||
| # Licensed under the Apache License, Version 2.0 (the "License"); | ||
| # you may not use this file except in compliance with the License. | ||
| # You may obtain a copy of the License at | ||
| # | ||
| # http://www.apache.org/licenses/LICENSE-2.0 | ||
| # | ||
| # Unless required by applicable law or agreed to in writing, software | ||
| # distributed under the License is distributed on an "AS IS" BASIS, | ||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| # See the License for the specific language governing permissions and | ||
| # limitations under the License. | ||
|
|
||
| """GAX Wrapper for interacting with the Stackdriver Trace API.""" | ||
|
|
||
| from google.cloud.gapic.trace.v1 import trace_service_client | ||
| from google.cloud.proto.devtools.cloudtrace.v1 import trace_pb2 | ||
| from google.gax import CallOptions | ||
| from google.gax import INITIAL_PAGE | ||
| from google.cloud._helpers import make_secure_channel | ||
| from google.cloud._http import DEFAULT_USER_AGENT | ||
| from google.cloud.iterator import GAXIterator | ||
| from google.protobuf.json_format import MessageToDict | ||
| from google.protobuf.json_format import ParseDict | ||
|
|
||
|
|
||
| class _TraceAPI(object): | ||
| """Wrapper to help mapping trace-related APIs. | ||
|
|
||
| See | ||
| https://cloud.google.com/trace/docs/reference/v1/rpc/google.devtools. | ||
| cloudtrace.v1 | ||
|
|
||
| :type gax_api: | ||
| :class:`~google.cloud.gapic.trace.v1.trace_service_client. | ||
| TraceServiceClient` | ||
| :param gax_api: API object used to make GAX requests. | ||
|
|
||
| :type client: :class:`~google.cloud.trace.client.Client` | ||
| :param client: The client that owns this API object. | ||
| """ | ||
| def __init__(self, gax_api, client): | ||
| self._gax_api = gax_api | ||
| self.client = client | ||
|
|
||
| def patch_traces(self, project_id, traces, options=None): | ||
| """Sends new traces to Stackdriver Trace or updates existing traces. | ||
|
|
||
| :type project_id: str | ||
| :param project_id: ID of the Cloud project where the trace data is | ||
| stored. | ||
|
|
||
| :type traces: dict | ||
| :param traces: The traces to be patched in the API call. | ||
|
|
||
| :type options: :class:`~google.gax.CallOptions` | ||
| :param options: (Optional) Overrides the default settings for this | ||
| call, e.g, timeout, retries etc. | ||
| """ | ||
| traces_pb = _traces_mapping_to_pb(traces) | ||
| self._gax_api.patch_traces(project_id, traces_pb, options) | ||
|
|
||
| def get_trace(self, project_id, trace_id, options=None): | ||
| """Gets a single trace by its ID. | ||
|
|
||
| :type project_id: str | ||
| :param project_id: ID of the Cloud project where the trace data is | ||
| stored. | ||
|
|
||
| :type trace_id: str | ||
| :param trace_id: ID of the trace to return. | ||
|
|
||
| :type options: :class:`~google.gax.CallOptions` | ||
| :param options: (Optional) Overrides the default settings for this | ||
| call, e.g, timeout, retries etc. | ||
|
|
||
| :rtype: :dict | ||
| :returns: A Trace dict. | ||
| """ | ||
| trace_pb = self._gax_api.get_trace(project_id, trace_id, options) | ||
| trace_mapping = _parse_trace_pb(trace_pb) | ||
| return trace_mapping | ||
|
|
||
| def list_traces( | ||
| self, | ||
| project_id, | ||
| view=None, | ||
| page_size=None, | ||
| start_time=None, | ||
| end_time=None, | ||
| filter_=None, | ||
| order_by=None, | ||
| page_token=None): | ||
| """Returns of a list of traces that match the specified filter | ||
| conditions. | ||
|
|
||
| :type project_id: str | ||
| :param project_id: ID of the Cloud project where the trace data is | ||
| stored. | ||
|
|
||
| :type view: :class:`google.cloud.gapic.trace.v1.enums. | ||
| ListTracesRequest.ViewType` | ||
| :param view: (Optional) Type of data returned for traces in the list. | ||
| Default is ``MINIMAL``. | ||
|
|
||
| :type page_size: int | ||
| :param page_size: (Optional) Maximum number of traces to return. | ||
| If not specified or <= 0, the implementation selects | ||
| a reasonable value. The implementation may return | ||
| fewer traces than the requested page size. | ||
|
|
||
| :type start_time: :class:`google.protobuf.timestamp_pb2.Timestamp` | ||
| :param start_time: (Optional) Start of the time interval (inclusive) | ||
| during which the trace data was collected from the | ||
| application. | ||
|
|
||
| :type end_time: :class:`google.protobuf.timestamp_pb2.Timestamp` | ||
| :param end_time: (Optional) End of the time interval (inclusive) | ||
| during which the trace data was collected from the | ||
| application. | ||
|
|
||
| :type filter_: str | ||
| :param filter_: (Optional) An optional filter for the request. | ||
|
|
||
| :type order_by: str | ||
| :param order_by: (Optional) Field used to sort the returned traces. | ||
|
|
||
| :type page_token: str | ||
| :param page_token: opaque marker for the next "page" of entries. If not | ||
| passed, the API will return the first page of | ||
| entries. | ||
|
|
||
| :rtype: :class:`~google.cloud.iterator.Iterator` | ||
| :returns: Traces that match the specified filter conditions. | ||
| """ | ||
| if page_token is None: | ||
| page_token = INITIAL_PAGE | ||
| options = CallOptions(page_token=page_token) | ||
| page_iter = self._gax_api.list_traces( | ||
| project_id=project_id, | ||
| view=view, | ||
| page_size=page_size, | ||
| start_time=start_time, | ||
| end_time=end_time, | ||
| filter_=filter_, | ||
| order_by=order_by, | ||
| options=options) | ||
| item_to_value = _item_to_mapping | ||
| return GAXIterator(self.client, page_iter, item_to_value) | ||
|
|
||
|
|
||
| def _parse_trace_pb(trace_pb): | ||
| """Parse a ``Trace`` protobuf to a dictionary. | ||
|
|
||
| :type trace_pb: :class:`google.cloud.proto.devtools.cloudtrace.v1. | ||
| trace_pb2.Trace` | ||
| :param trace_pb: A trace protobuf instance. | ||
|
|
||
| :rtype: dict | ||
| :returns: The converted trace dict. | ||
| """ | ||
| try: | ||
| return MessageToDict(trace_pb) | ||
| except TypeError: | ||
| raise | ||
|
|
||
|
|
||
| def _item_to_mapping(iterator, trace_pb): | ||
This comment was marked as spam.
Sorry, something went wrong.
This comment was marked as spam.
Sorry, something went wrong.
This comment was marked as spam.
Sorry, something went wrong.
This comment was marked as spam.
Sorry, something went wrong. |
||
| """Helper callable function for the GAXIterator | ||
|
|
||
| :type iterator: :class:`~google.cloud.iterator.Iterator` | ||
| :param iterator: The iterator that is currently in use. | ||
|
|
||
| :type trace_pb: :class:`google.cloud.proto.devtools.cloudtrace.v1. | ||
| trace_pb2.Trace` | ||
| :param trace_pb: A trace protobuf instance. | ||
| """ | ||
| mapping = _parse_trace_pb(trace_pb) | ||
| return mapping | ||
|
|
||
|
|
||
| def make_gax_trace_api(client): | ||
| """Create an instance of the GAX Trace API. | ||
|
|
||
| :type client: :class:`~google.cloud.trace.client.Client` | ||
| :param client: The client that holds configuration details. | ||
|
|
||
| :rtype: :class:`~google.cloud.trace._gax._TraceAPI` | ||
| :returns: A Trace API instance with the proper configurations. | ||
| """ | ||
| channel = make_secure_channel( | ||
| client._credentials, | ||
| DEFAULT_USER_AGENT, | ||
| trace_service_client.TraceServiceClient.SERVICE_ADDRESS) | ||
| generated = trace_service_client.TraceServiceClient( | ||
| channel=channel, | ||
| lib_name='gccl') | ||
| return _TraceAPI(generated, client) | ||
|
|
||
|
|
||
| def _traces_mapping_to_pb(traces_mapping): | ||
| """Convert a trace dict to protobuf. | ||
|
|
||
| :type traces_mapping: dict | ||
| :param traces_mapping: A trace mapping. | ||
|
|
||
| :rtype: class:`google.cloud.proto.devtools.cloudtrace.v1.trace_pb2.Traces` | ||
| :returns: The converted protobuf type traces. | ||
| """ | ||
| traces_pb = trace_pb2.Traces() | ||
| ParseDict(traces_mapping, traces_pb) | ||
| return traces_pb | ||
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This comment was marked as spam.
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
This comment was marked as spam.
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
This comment was marked as spam.
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.