You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by al...@apache.org on 2020/08/23 06:52:55 UTC

[skywalking-python] branch urllib3 created (now 1bfa47c)

This is an automated email from the ASF dual-hosted git repository.

alonelaval pushed a change to branch urllib3
in repository https://gitbox.apache.org/repos/asf/skywalking-python.git.


      at 1bfa47c  changed kubernetes to urllib3

This branch includes the following new commits:

     new 1bfa47c  changed kubernetes to urllib3

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[skywalking-python] 01/01: changed kubernetes to urllib3

Posted by al...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

alonelaval pushed a commit to branch urllib3
in repository https://gitbox.apache.org/repos/asf/skywalking-python.git

commit 1bfa47c94c9316615d7fbcb06db02cb95d7274aa
Author: huawei <hu...@bit-s.cn>
AuthorDate: Sun Aug 23 14:52:29 2020 +0800

    changed kubernetes to urllib3
---
 .github/workflows/build.yaml                       |  6 --
 docs/Plugins.md                                    |  2 +-
 requirements.txt                                   | 12 +++-
 setup.py                                           |  2 +-
 skywalking/__init__.py                             |  2 +-
 .../plugins/{sw_kubernetes.py => sw_urllib3.py}    | 30 ++++----
 .../services => sw_urllib3}/__init__.py            |  0
 .../docker-compose.yml                             | 22 +++++-
 .../expected.data.yml                              | 82 ++++++++--------------
 .../services}/__init__.py                          |  0
 .../services/consumer.py                           | 20 ++----
 .../services/provider.py}                          | 21 ++----
 .../test_urllib3.py}                               |  3 +-
 13 files changed, 93 insertions(+), 109 deletions(-)

diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml
index bbec008..69d871c 100644
--- a/.github/workflows/build.yaml
+++ b/.github/workflows/build.yaml
@@ -39,12 +39,6 @@ jobs:
         uses: actions/setup-python@v2
         with:
           python-version: ${{ matrix.python-version }}
-      - name: Setup k3s
-          run: curl -sfL https://get.k3s.io | sh -
-      - name: set kubeconfig
-          env:
-            KUBECONFIG: /etc/rancher/k3s/k3s.yaml
-        run: sudo mkdir ~/.kube && sudo cp ${KUBECONFIG} ~/.kube/config
       - name: Set up dependencies
         run: make setup install
       - name: Lint codes
diff --git a/docs/Plugins.md b/docs/Plugins.md
index 7a579c0..4ed549d 100644
--- a/docs/Plugins.md
+++ b/docs/Plugins.md
@@ -31,7 +31,7 @@ Library | Versions | Plugin Name
 | [pika](https://pika.readthedocs.io/en/stable/) | 1.1.0 | `sw_rabbitmq` |
 | [pymongo](https://pymongo.readthedocs.io/en/stable/) | 3.11.0 | `sw_pymongo` |
 | [elasticsearch](https://github.com/elastic/elasticsearch-py) | 7.9.0 | `sw_elasticsearch` |
-| [kubernetes](https://github.com/kubernetes-client/python) | 11.0.0 | `sw_kubernetes` |
+| [urllib3](https://urllib3.readthedocs.io/en/latest/) | 1.25.10 | `sw_urllib3` |
 
 The column `Versions` only indicates that the versions are tested, if you found the newer versions are also supported, welcome to add the newer version into the table.
 >>>>>>> master
diff --git a/requirements.txt b/requirements.txt
index 7fb382b..68ebe78 100755
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,6 +1,8 @@
+apache-skywalking==0.2.0
 asgiref==3.2.10
 attrs==19.3.0
 blindspin==2.0.1
+cachetools==4.1.1
 certifi==2020.6.20
 chardet==3.0.4
 click==7.1.2
@@ -12,9 +14,11 @@ docker==4.2.2
 elasticsearch==7.8.0
 Flask==1.1.2
 gevent==20.6.2
+google-auth==1.20.1
 greenlet==0.4.16
 grpcio==1.31.0
 grpcio-tools==1.31.0
+gunicorn==20.0.4
 idna==2.10
 importlib-metadata==1.7.0
 iniconfig==1.0.1
@@ -23,30 +27,36 @@ Jinja2==2.11.2
 kafka-python==2.0.1
 MarkupSafe==1.1.1
 more-itertools==8.4.0
+oauthlib==3.1.0
 packaging==20.4
 parameterized==0.7.4
 pika==1.1.0
 pluggy==0.13.1
 protobuf==3.12.4
 py==1.9.0
+pyasn1==0.4.8
+pyasn1-modules==0.2.8
 pymongo==3.11.0
 PyMySQL==0.10.0
 pyparsing==2.4.7
 pytest==6.0.1
+python-dateutil==2.8.1
 pytz==2020.1
 PyYAML==5.3.1
 redis==3.5.3
 requests==2.24.0
+requests-oauthlib==1.3.0
+rsa==4.6
 six==1.15.0
 sqlparse==0.3.1
 testcontainers==3.0.3
 toml==0.10.1
 tornado==6.0.4
 urllib3==1.25.10
+uWSGI==2.0.19.1
 websocket-client==0.57.0
 Werkzeug==1.0.1
 wrapt==1.12.1
-kubernetes==11.0.0
 zipp==3.1.0
 zope.event==4.4
 zope.interface==5.1.0
diff --git a/setup.py b/setup.py
index 98a00c2..4d3f669 100644
--- a/setup.py
+++ b/setup.py
@@ -54,7 +54,7 @@ setup(
             "pika",
             "pymongo",
             "elasticsearch",
-            "kubernetes",
+            "urllib3",
             "pytest",
         ],
     },
diff --git a/skywalking/__init__.py b/skywalking/__init__.py
index 005e93a..6df8ecb 100644
--- a/skywalking/__init__.py
+++ b/skywalking/__init__.py
@@ -36,7 +36,7 @@ class Component(Enum):
     RabbitmqProducer = 52
     RabbitmqConsumer = 53
     Elasticsearch = 47
-    Kubernetes = 96
+    Urllib3 = 7006
 
 
 class Layer(Enum):
diff --git a/skywalking/plugins/sw_kubernetes.py b/skywalking/plugins/sw_urllib3.py
similarity index 69%
rename from skywalking/plugins/sw_kubernetes.py
rename to skywalking/plugins/sw_urllib3.py
index f6af33a..a8fc984 100644
--- a/skywalking/plugins/sw_kubernetes.py
+++ b/skywalking/plugins/sw_urllib3.py
@@ -19,6 +19,7 @@ import logging
 
 from skywalking import Layer, Component
 from skywalking.trace import tags
+from skywalking.trace.carrier import Carrier
 from skywalking.trace.context import get_context
 from skywalking.trace.tags import Tag
 
@@ -28,25 +29,30 @@ logger = logging.getLogger(__name__)
 def install():
     # noinspection PyBroadException
     try:
-        from kubernetes.client.rest import RESTClientObject
+        from urllib3.request import RequestMethods
 
-        _request = RESTClientObject.request
+        _request = RequestMethods.request
 
-        def _sw_request(this: RESTClientObject, method, url, query_params=None, headers=None,
-                        body=None, post_params=None, _preload_content=True,
-                        _request_timeout=None):
+        def _sw_request(this: RequestMethods, method, url, fields=None, headers=None, **urlopen_kw):
 
             from urllib.parse import urlparse
             url_param = urlparse(url)
-
+            carrier = Carrier()
             context = get_context()
-            with context.new_exit_span(op=url_param.path or "/", peer=url_param.netloc) as span:
+            with context.new_exit_span(op=url_param.path or "/", peer=url_param.netloc, carrier=carrier) as span:
                 span.layer = Layer.Http
-                span.component = Component.Kubernetes
+                span.component = Component.Urllib3
+
+                if headers is None:
+                    headers = {}
+                    for item in carrier:
+                        headers[item.key] = item.val
+                else:
+                    for item in carrier:
+                        headers[item.key] = item.val
+
                 try:
-                    res = _request(this, method, url, query_params=query_params, headers=headers,
-                                   post_params=post_params, body=body, _preload_content=_preload_content,
-                                   _request_timeout=_request_timeout)
+                    res = _request(this, method, url, fields=fields, headers=headers, **urlopen_kw)
 
                     span.tag(Tag(key=tags.HttpMethod, val=method.upper()))
                     span.tag(Tag(key=tags.HttpUrl, val=url))
@@ -58,6 +64,6 @@ def install():
                     raise e
                 return res
 
-        RESTClientObject.request = _sw_request
+        RequestMethods.request = _sw_request
     except Exception:
         logger.warning('failed to install plugin %s', __name__)
diff --git a/tests/plugin/sw_kubernates/services/__init__.py b/tests/plugin/sw_urllib3/__init__.py
similarity index 100%
rename from tests/plugin/sw_kubernates/services/__init__.py
rename to tests/plugin/sw_urllib3/__init__.py
diff --git a/tests/plugin/sw_kubernates/docker-compose.yml b/tests/plugin/sw_urllib3/docker-compose.yml
similarity index 64%
rename from tests/plugin/sw_kubernates/docker-compose.yml
rename to tests/plugin/sw_urllib3/docker-compose.yml
index 4d2bb8d..d9683a9 100644
--- a/tests/plugin/sw_kubernates/docker-compose.yml
+++ b/tests/plugin/sw_urllib3/docker-compose.yml
@@ -23,6 +23,24 @@ services:
       service: collector
       file: ../docker/docker-compose.base.yml
 
+  provider:
+    extends:
+      service: agent
+      file: ../docker/docker-compose.base.yml
+    ports:
+      - 9091:9091
+    volumes:
+      - .:/app
+    command: ['bash', '-c', 'pip install flask && pip install -r /app/requirements.txt && python3 /app/services/provider.py']
+    depends_on:
+      collector:
+        condition: service_healthy
+    healthcheck:
+      test: ["CMD", "bash", "-c", "cat < /dev/null > /dev/tcp/127.0.0.1/9091"]
+      interval: 5s
+      timeout: 60s
+      retries: 120
+
   consumer:
     extends:
       service: agent
@@ -31,10 +49,12 @@ services:
       - 9090:9090
     volumes:
       - ./services/consumer.py:/app/consumer.py
-    command: ['bash', '-c', 'pip install flask && pip install kubernetes && python3 /app/consumer.py']
+    command: ['bash', '-c', 'pip install flask && pip install urllib3 && python3 /app/consumer.py']
     depends_on:
       collector:
         condition: service_healthy
+      provider:
+        condition: service_healthy
 
 networks:
   beyond:
diff --git a/tests/plugin/sw_kubernates/expected.data.yml b/tests/plugin/sw_urllib3/expected.data.yml
similarity index 58%
rename from tests/plugin/sw_kubernates/expected.data.yml
rename to tests/plugin/sw_urllib3/expected.data.yml
index 8ce92f7..42f9c3c 100644
--- a/tests/plugin/sw_kubernates/expected.data.yml
+++ b/tests/plugin/sw_urllib3/expected.data.yml
@@ -15,86 +15,62 @@
 # limitations under the License.
 #
 
+
 segmentItems:
-  - serviceName: consumer
+  - serviceName: provider
     segmentSize: 1
     segments:
       - segmentId: not null
         spans:
-          - operationName: /api/v1/namespaces
+          - operationName: /users
             operationId: 0
-            parentSpanId: 0
-            spanId: 1
+            parentSpanId: -1
+            spanId: 0
             spanLayer: Http
-            startTime: gt 0
-            endTime: gt 0
-            componentId: 96
-            isError: false
-            spanType: Exit
-            peer: not null
-            skipAnalysis: false
             tags:
               - key: http.method
-                value: GET
+                value: POST
               - key: url
-                value: not null
+                value: http://provider:9091/users
               - key: status.code
                 value: '200'
-          - operationName: /api/v1/pods
-            operationId: 0
-            parentSpanId: 0
-            spanId: 2
-            spanLayer: Http
+            refs:
+              - parentEndpoint: /users
+                networkAddress: 'provider:9091'
+                refType: CrossProcess
+                parentSpanId: 1
+                parentTraceSegmentId: not null
+                parentServiceInstance: not null
+                parentService: consumer
+                traceId: not null
             startTime: gt 0
             endTime: gt 0
-            componentId: 96
-            isError: false
-            spanType: Exit
-            peer: not null
-            skipAnalysis: false
-            tags:
-              - key: http.method
-                value: GET
-              - key: url
-                value: not null
-              - key: status.code
-                value: '200'
-          - operationName: /apis/apps/v1/deployments
-            operationId: 0
-            parentSpanId: 0
-            spanId: 3
-            spanLayer: Http
-            startTime: gt 0
-            endTime: gt 0
-            componentId: 96
-            isError: false
-            spanType: Exit
+            componentId: 7001
+            spanType: Entry
             peer: not null
             skipAnalysis: false
-            tags:
-              - key: http.method
-                value: GET
-              - key: url
-                value: not null
-              - key: status.code
-                value: '200'
-          - operationName: /apis/networking.k8s.io/v1beta1/ingresses
+  - serviceName: consumer
+    segmentSize: 1
+    segments:
+      - segmentId: not null
+        spans:
+          - operationName: /users
             operationId: 0
             parentSpanId: 0
-            spanId: 4
+            spanId: 1
             spanLayer: Http
             startTime: gt 0
             endTime: gt 0
-            componentId: 96
+            componentId: 7006
             isError: false
             spanType: Exit
             peer: not null
             skipAnalysis: false
             tags:
               - key: http.method
-                value: GET
+                value: POST
               - key: url
-                value: not null
+                value: 'http://provider:9091/users'
               - key: status.code
                 value: '200'
           - operationName: /users
@@ -115,4 +91,4 @@ segmentItems:
               - key: url
                 value: 'http://0.0.0.0:9090/users'
               - key: status.code
-                value: '200'
+                value: '200'
\ No newline at end of file
diff --git a/tests/plugin/sw_kubernates/__init__.py b/tests/plugin/sw_urllib3/services/__init__.py
similarity index 100%
rename from tests/plugin/sw_kubernates/__init__.py
rename to tests/plugin/sw_urllib3/services/__init__.py
diff --git a/tests/plugin/sw_kubernates/services/consumer.py b/tests/plugin/sw_urllib3/services/consumer.py
similarity index 69%
copy from tests/plugin/sw_kubernates/services/consumer.py
copy to tests/plugin/sw_urllib3/services/consumer.py
index 4b160c0..a039baf 100644
--- a/tests/plugin/sw_kubernates/services/consumer.py
+++ b/tests/plugin/sw_urllib3/services/consumer.py
@@ -14,11 +14,10 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #
-
+import json
 
 from skywalking import agent, config
 
-
 if __name__ == '__main__':
     config.service_name = 'consumer'
     config.logging_level = 'DEBUG'
@@ -26,25 +25,16 @@ if __name__ == '__main__':
 
     from flask import Flask, jsonify
 
-
     app = Flask(__name__)
+    import urllib3
 
 
     @app.route("/users", methods=["POST", "GET"])
     def application():
-        from kubernetes import client
-        import kubernetes.config as kube_config
-        kube_config.load_kube_config()
-        core_conn = client.CoreV1Api()
-        apps_conn = client.AppsV1Api()
-        net_conn = client.NetworkingV1beta1Api()
-
-        core_conn.list_namespace()
-        core_conn.list_pod_for_all_namespaces()
-        apps_conn.list_deployment_for_all_namespaces()
-        net_conn.list_ingress_for_all_namespaces()
-        return jsonify({"song": "Despacito", "artist": "Luis Fonsi"})
+        http = urllib3.PoolManager()
+        res = http.request("POST", "http://provider:9091/users")
 
+        return jsonify(json.loads(res.data.decode('utf-8')))
 
     PORT = 9090
     app.run(host='0.0.0.0', port=PORT, debug=True)
diff --git a/tests/plugin/sw_kubernates/services/consumer.py b/tests/plugin/sw_urllib3/services/provider.py
similarity index 70%
rename from tests/plugin/sw_kubernates/services/consumer.py
rename to tests/plugin/sw_urllib3/services/provider.py
index 4b160c0..11f2c0b 100644
--- a/tests/plugin/sw_kubernates/services/consumer.py
+++ b/tests/plugin/sw_urllib3/services/provider.py
@@ -15,36 +15,23 @@
 # limitations under the License.
 #
 
+import time
 
 from skywalking import agent, config
 
-
 if __name__ == '__main__':
-    config.service_name = 'consumer'
+    config.service_name = 'provider'
     config.logging_level = 'DEBUG'
     agent.start()
 
     from flask import Flask, jsonify
 
-
     app = Flask(__name__)
 
-
     @app.route("/users", methods=["POST", "GET"])
     def application():
-        from kubernetes import client
-        import kubernetes.config as kube_config
-        kube_config.load_kube_config()
-        core_conn = client.CoreV1Api()
-        apps_conn = client.AppsV1Api()
-        net_conn = client.NetworkingV1beta1Api()
-
-        core_conn.list_namespace()
-        core_conn.list_pod_for_all_namespaces()
-        apps_conn.list_deployment_for_all_namespaces()
-        net_conn.list_ingress_for_all_namespaces()
+        time.sleep(0.5)
         return jsonify({"song": "Despacito", "artist": "Luis Fonsi"})
 
-
-    PORT = 9090
+    PORT = 9091
     app.run(host='0.0.0.0', port=PORT, debug=True)
diff --git a/tests/plugin/sw_kubernates/test_kubernates.py b/tests/plugin/sw_urllib3/test_urllib3.py
similarity index 95%
rename from tests/plugin/sw_kubernates/test_kubernates.py
rename to tests/plugin/sw_urllib3/test_urllib3.py
index d1f2f17..e56a82b 100644
--- a/tests/plugin/sw_kubernates/test_kubernates.py
+++ b/tests/plugin/sw_urllib3/test_urllib3.py
@@ -30,7 +30,8 @@ def prepare():
 
 class TestPlugin(TestPluginBase):
     @pytest.mark.parametrize('version', [
-        'kubernetes==11.0.0',
+        'urllib3==1.25.10',
+        'urllib3==1.25.9'
     ])
     def test_plugin(self, docker_compose, version):
         self.validate()