mirror of https://github.com/grpc/grpc.git
Merge https://github.com/grpc/grpc into cg-timeout
commit
a3cef45ade
20 changed files with 300 additions and 16 deletions
@ -0,0 +1,7 @@ |
|||||||
|
gRPC Python Observability |
||||||
|
==================== |
||||||
|
|
||||||
|
Module Contents |
||||||
|
--------------- |
||||||
|
|
||||||
|
.. automodule:: grpc_observability |
@ -1,2 +1,91 @@ |
|||||||
### TODO(xuanwn) |
gRPC Python Observability |
||||||
* Fill in content. |
=========== |
||||||
|
Package for gRPC Python Observability. |
||||||
|
|
||||||
|
More details can be found in `OpenTelemetry Metrics gRFC <https://github.com/grpc/proposal/blob/master/A66-otel-stats.md#opentelemetry-metrics>`_. |
||||||
|
|
||||||
|
How gRPC Python Observability Works |
||||||
|
------------------------- |
||||||
|
|
||||||
|
gRPC Python is a wrapper layer built upon the gRPC Core (written in C/C++). Most of telemetry data |
||||||
|
is collected at core layer and then exported to Python layer. To optimize performance and reduce |
||||||
|
the overhead of acquiring the GIL too frequently, telemetry data is initially cached at the Core layer |
||||||
|
and then exported to the Python layer in batches. |
||||||
|
|
||||||
|
Note that while this approach enhances efficiency, it will introduce a slight delay between the |
||||||
|
time the data is collected and the time it becomes available through Python exporters. |
||||||
|
|
||||||
|
|
||||||
|
Supported Python Versions |
||||||
|
------------------------- |
||||||
|
Python >= 3.7 |
||||||
|
|
||||||
|
Installation |
||||||
|
------------ |
||||||
|
|
||||||
|
Currently gRPC Python Observability is **only available for Linux**. |
||||||
|
|
||||||
|
Installing From PyPI |
||||||
|
~~~~~~~~~~~~~~~~~~~~ |
||||||
|
|
||||||
|
:: |
||||||
|
|
||||||
|
$ pip install grpcio-observability |
||||||
|
|
||||||
|
|
||||||
|
Installing From Source |
||||||
|
~~~~~~~~~~~~~~~~~~~~~~ |
||||||
|
|
||||||
|
Building from source requires that you have the Python headers (usually a |
||||||
|
package named :code:`python-dev`) and Cython installed. It further requires a |
||||||
|
GCC-like compiler to go smoothly; you can probably get it to work without |
||||||
|
GCC-like stuff, but you may end up having a bad time. |
||||||
|
|
||||||
|
:: |
||||||
|
|
||||||
|
$ export REPO_ROOT=grpc # REPO_ROOT can be any directory of your choice |
||||||
|
$ git clone -b RELEASE_TAG_HERE https://github.com/grpc/grpc $REPO_ROOT |
||||||
|
$ cd $REPO_ROOT |
||||||
|
$ git submodule update --init |
||||||
|
|
||||||
|
$ cd src/python/grpcio_observability |
||||||
|
$ python -m make_grpcio_observability |
||||||
|
|
||||||
|
# For the next command do `sudo pip install` if you get permission-denied errors |
||||||
|
$ GRPC_PYTHON_BUILD_WITH_CYTHON=1 pip install . |
||||||
|
|
||||||
|
|
||||||
|
Dependencies |
||||||
|
------------------------- |
||||||
|
gRPC Python Observability Depends on the following packages: |
||||||
|
|
||||||
|
:: |
||||||
|
|
||||||
|
grpcio |
||||||
|
opentelemetry-sdk==1.21.0 |
||||||
|
opentelemetry-api==1.21.0 |
||||||
|
|
||||||
|
|
||||||
|
Usage |
||||||
|
----- |
||||||
|
|
||||||
|
You can find example usage in `Python example folder <https://github.com/grpc/grpc/tree/master/examples/python/observability>`_. |
||||||
|
|
||||||
|
We also provide several environment variables to help you optimize gRPC python observability for your particular use. |
||||||
|
|
||||||
|
1. GRPC_PYTHON_CENSUS_EXPORT_BATCH_INTERVAL |
||||||
|
* This controls how frequently telemetry data collected within gRPC Core is sent to Python layer. |
||||||
|
* Default value is 0.5 (Seconds). |
||||||
|
|
||||||
|
2. GRPC_PYTHON_CENSUS_MAX_EXPORT_BUFFER_SIZE |
||||||
|
* This controls the maximum number of telemetry data items that can be held in the buffer within gRPC Core before they are sent to Python. |
||||||
|
* Default value is 10,000. |
||||||
|
|
||||||
|
3. GRPC_PYTHON_CENSUS_EXPORT_THRESHOLD |
||||||
|
* This setting acts as a trigger: When the buffer in gRPC Core reaches a certain percentage of its capacity, the telemetry data is sent to Python. |
||||||
|
* Default value is 0.7 (Which means buffer will start export when it's 70% full). |
||||||
|
|
||||||
|
4. GRPC_PYTHON_CENSUS_EXPORT_THREAD_TIMEOUT |
||||||
|
* This controls the maximum time allowed for the exporting thread (responsible for sending data to Python) to complete. |
||||||
|
* Main thread will terminate the exporting thread after this timeout. |
||||||
|
* Default value is 10 (Seconds). |
||||||
|
@ -0,0 +1,25 @@ |
|||||||
|
# Copyright 2024 gRPC authors. |
||||||
|
# |
||||||
|
# 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. |
||||||
|
|
||||||
|
_BEFORE_IMPORT = tuple(globals()) |
||||||
|
|
||||||
|
from grpc_observability import * # pylint: disable=wildcard-import,unused-wildcard-import |
||||||
|
|
||||||
|
_AFTER_IMPORT = tuple(globals()) |
||||||
|
|
||||||
|
GRPC_OBSERVABILITY_ELEMENTS = tuple( |
||||||
|
element |
||||||
|
for element in _AFTER_IMPORT |
||||||
|
if element not in _BEFORE_IMPORT and element != "_BEFORE_IMPORT" |
||||||
|
) |
@ -0,0 +1,37 @@ |
|||||||
|
# Copyright 2024 gRPC authors. |
||||||
|
# |
||||||
|
# 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. |
||||||
|
"""Test of gRPC Python Observability's application-layer API.""" |
||||||
|
|
||||||
|
import logging |
||||||
|
import unittest |
||||||
|
|
||||||
|
from tests.observability import _from_observability_import_star |
||||||
|
|
||||||
|
|
||||||
|
class AllTest(unittest.TestCase): |
||||||
|
def testAll(self): |
||||||
|
expected_observability_code_elements = ( |
||||||
|
"OpenTelemetryObservability", |
||||||
|
"OpenTelemetryPlugin", |
||||||
|
) |
||||||
|
|
||||||
|
self.assertCountEqual( |
||||||
|
expected_observability_code_elements, |
||||||
|
_from_observability_import_star.GRPC_OBSERVABILITY_ELEMENTS, |
||||||
|
) |
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__": |
||||||
|
logging.basicConfig() |
||||||
|
unittest.main(verbosity=2) |
Loading…
Reference in new issue