Topik ini menjelaskan cara mengimpor data jejak dari aplikasi Python ke Layanan Log Sederhana menggunakan OpenTelemetry SDK untuk Python.
Prasyarat
Instansi jejak telah dibuat. Untuk informasi lebih lanjut, lihat Buat Instansi Jejak.
Lingkungan pengembangan Python telah disiapkan dengan versi Python 3.7 atau lebih baru.
OpenTelemetry SDK untuk Python telah diinstal di lingkungan pengembangan Python Anda.
Jika OpenTelemetry SDK untuk Python belum diinstal, jalankan perintah berikut untuk menginstalnya:
pip install opentelemetry-api==1.12.0 pip install opentelemetry-sdk==1.12.0 pip install opentelemetry-exporter-otlp==1.12.0
Prosedur
Inisialisasi penyedia OpenTelemetry.
Periksa apakah kondisi untuk mengimpor data dalam mode semi-otomatis terpenuhi.
Jika kondisi terpenuhi, impor data jejak dalam mode semi-otomatis.
Untuk skenario di mana data jejak tidak dapat diimpor dalam mode semi-otomatis, impor data dalam mode manual.
Jika kondisi tidak terpenuhi, impor data jejak dalam mode manual.
Langkah 1: Inisialisasi penyedia OpenTelemetry
Gunakan kode berikut untuk menginisialisasi penyedia OpenTelemetry. Ganti variabel dalam kode dengan nilai sebenarnya. Untuk detail tentang variabel, lihat Variabel.
# For Opentelemetry
import socket
from opentelemetry import trace
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
from opentelemetry.sdk.resources import Resource
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.sdk.trace.export import ConsoleSpanExporter
from opentelemetry.sdk.trace.export import SimpleSpanProcessor
class OpenTelemetrySLSProvider(object):
def __init__(self, namespace="", service="", version="", endpoint='stdout',
project=None, instance=None, access_key_id=None, access_key_secret=None):
'''
:param namespace: Namespace layanan Anda
:param service: Nama Layanan Aplikasi Anda
:param version: Versi Aplikasi Anda
:param endpoint: konsol atau https://sls_endpoint:10010
:param project: Proyek SLS
:param instance: ID Instansi OTEL SLS
:param access_key_id: ID AccessKey Aliyun
:param access_key_secret: Rahasia AccessKey Aliyun
'''
self.sls_otel_endpoint = endpoint
self.sls_otel_project = project
self.sls_otel_akid = access_key_id
self.sls_otel_aksecret = access_key_secret
self.sls_otel_instanceid = instance
self.local_mode = False
if endpoint == "stdout":
self.local_mode = True
self.resource = Resource(attributes={
"host.name": socket.gethostname(),
"service.name": service,
"service.namespace": namespace,
"service.version": version})
else:
self.resource = Resource(attributes={
"host.name": socket.gethostname(),
"service.namespace": namespace,
"service.name": service,
"service.version": version,
"sls.otel.project": self.sls_otel_project,
"sls.otel.akid": self.sls_otel_akid,
"sls.otel.aksecret": self.sls_otel_aksecret,
"sls.otel.instanceid": self.sls_otel_instanceid
})
def initTracer(self):
trace.set_tracer_provider(TracerProvider(resource=self.resource))
if self.local_mode:
trace.get_tracer_provider().add_span_processor(SimpleSpanProcessor(ConsoleSpanExporter()))
else:
otlp_exporter = OTLPSpanExporter(endpoint=self.sls_otel_endpoint)
trace.get_tracer_provider().add_span_processor(BatchSpanProcessor(otlp_exporter))
# mode debug
#sls_ot_provider = OpenTelemetrySLSProvider(service="example", version="v0.1.0")
# tulis ke sls
sls_ot_provider = OpenTelemetrySLSProvider(namespace="${service.namespace}", service="${service}", version="${version}",
endpoint='${endpoint}',
project="${project}",
instance="${instance}",
access_key_id="${access-key-id}",
access_key_secret="${access-key-secret}"
)Tabel 1. Variabel
Variabel | Deskripsi | Contoh |
${service.namespace} | Namespace tempat layanan berada. | order |
${service} | Nama layanan. Tentukan nilainya sesuai dengan kebutuhan bisnis Anda. | payment |
${version} | Versi layanan. Kami merekomendasikan Anda menentukan versi dalam format va.b.c. | v0.1.2 |
${endpoint} | Titik akhir proyek Layanan Log Sederhana. Format: https://${project}.${region-endpoint}:Port.
Catatan
| https://test-project.cn-hangzhou.log.aliyuncs.com:10010 |
${project} | Nama proyek Layanan Log Sederhana. | test-project |
${instance} | ID instansi jejak. Untuk informasi lebih lanjut, lihat Buat instansi jejak. | test-traces |
${access-key-id} | ID AccessKey akun Alibaba Cloud Anda. Kami merekomendasikan Anda menggunakan pasangan AccessKey dari pengguna RAM yang hanya memiliki izin tulis pada proyek Layanan Log Sederhana. Pasangan AccessKey terdiri dari ID AccessKey dan rahasia AccessKey. Untuk informasi lebih lanjut tentang cara memberikan izin tulis pada proyek tertentu kepada pengguna RAM, lihat Gunakan kebijakan kustom untuk memberikan izin kepada pengguna RAM. Untuk informasi lebih lanjut tentang cara mendapatkan pasangan AccessKey, lihat Pasangan AccessKey. | Tidak ada |
${access-key-secret} | Rahasia AccessKey akun Alibaba Cloud Anda. Kami merekomendasikan Anda menggunakan pasangan AccessKey dari pengguna RAM yang hanya memiliki izin tulis pada proyek Layanan Log Sederhana. | Tidak ada |
Langkah 2: Impor data
Impor data jejak ke Layanan Log Sederhana dalam mode semi-otomatis atau manual. OpenTelemetry SDK untuk Python menyediakan berbagai jenis paket instrumen yang mendukung instrumen semi-otomatis dari kerangka kerja umum. Jika menggunakan salah satu paket instrumen, impor data dalam mode semi-otomatis. Untuk informasi lebih lanjut, kunjungi Paket Instrumen.
Instrumen Semi-Otomatis
Contoh ini menggunakan paket instrumen flask dan requests.
Instal paket instrumen.
pip install requests pip install flask pip install opentelemetry-instrumentation-flask pip install opentelemetry-instrumentation-requestsJalankan kode.
Ganti variabel dalam kode berikut dengan nilai sebenarnya. Untuk informasi lebih lanjut, lihat Variabel.
# for flask import flask import requests # for Opentelemetry instrumentation import socket from opentelemetry.instrumentation.flask import FlaskInstrumentor from opentelemetry.instrumentation.requests import RequestsInstrumentor # For Opentelemetry pip install opentelemetry-instrumentation-requests from opentelemetry import trace from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import ( OTLPSpanExporter, ) from opentelemetry.sdk.resources import Resource from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.export import BatchSpanProcessor from opentelemetry.sdk.trace.export import ConsoleSpanExporter from opentelemetry.sdk.trace.export import SimpleSpanProcessor class OpenTelemetrySLSProvider(object): def __init__(self, namespace="", service="", version="", endpoint='stdout', project=None, instance=None, access_key_id=None, access_key_secret=None): ''' :param namespace: Namespace layanan Anda :param service: Nama Layanan Aplikasi Anda :param version: Versi Aplikasi Anda :param endpoint: konsol atau https://sls_endpoint:10010 :param project: Proyek SLS :param instance: ID Instansi OTEL SLS :param access_key_id: ID AccessKey Aliyun :param access_key_secret: Rahasia AccessKey Aliyun ''' self.sls_otel_endpoint = endpoint self.sls_otel_project = project self.sls_otel_akid = access_key_id self.sls_otel_aksecret = access_key_secret self.sls_otel_instanceid = instance self.local_mode = False if endpoint == "stdout": self.local_mode = True self.resource = Resource(attributes={ "host.name": socket.gethostname(), "service.name": service, "service.namespace": namespace, "service.version": version}) else: self.resource = Resource(attributes={ "host.name": socket.gethostname(), "service.name": service, "service.version": version, "service.namespace": namespace, "sls.otel.project": self.sls_otel_project, "sls.otel.akid": self.sls_otel_akid, "sls.otel.aksecret": self.sls_otel_aksecret, "sls.otel.instanceid": self.sls_otel_instanceid }) def initTracer(self): trace.set_tracer_provider(TracerProvider(resource=self.resource)) if self.local_mode: trace.get_tracer_provider().add_span_processor( SimpleSpanProcessor(ConsoleSpanExporter())) else: otlp_exporter = OTLPSpanExporter(endpoint=self.sls_otel_endpoint) trace.get_tracer_provider().add_span_processor(BatchSpanProcessor(otlp_exporter)) # tulis ke sls sls_ot_provider = OpenTelemetrySLSProvider(namespace="${service.namespace}", service="${service}", version="${version}", endpoint='${endpoint}', project="${project}", instance="${instance}", access_key_id="${access-key-id}", access_key_secret="${access-key-secret}" ) # untuk debug konsol #sls_ot_provider = OpenTelemetrySLSProvider(service="example", version="v0.1.0") sls_ot_provider.initTracer() # inisialisasi flask app = flask.Flask(__name__) # inisialisasi instrumen FlaskInstrumentor().instrument_app(app) RequestsInstrumentor().instrument() @app.route("/") def hello(): tracer = trace.get_tracer(__name__) with tracer.start_as_current_span("request_server"): requests.get("http://www.taobao.com") return "hello" app.run(debug=True, port=5000)Akses layanan untuk memicu pembuatan data jejak dan kirim data jejak ke Layanan Log Sederhana.
127.0.0.1:5000/hello
Instrumen Manual
Jalankan kode berikut. Ganti variabel dalam kode dengan nilai sebenarnya. Untuk informasi lebih lanjut tentang kode, lihat Variabel.
# ot-manual-example.py import time # For Opentelemetry import socket from opentelemetry import trace from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter from opentelemetry.sdk.resources import Resource from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.export import BatchSpanProcessor from opentelemetry.sdk.trace.export import ConsoleSpanExporter from opentelemetry.sdk.trace.export import SimpleSpanProcessor class OpenTelemetrySLSProvider(object): def __init__(self, namespace="", service="", version="", endpoint='stdout', project=None, instance=None, access_key_id=None, access_key_secret=None): ''' :param service: Namespace layanan Anda :param service: Nama Layanan Aplikasi Anda :param version: Versi Aplikasi Anda :param endpoint: konsol atau https://sls_endpoint:10010 :param project: Proyek SLS :param instance: ID Instansi OTEL SLS :param access_key_id: ID AccessKey Aliyun :param access_key_secret: Rahasia AccessKey Aliyun ''' self.sls_otel_endpoint = endpoint self.sls_otel_project = project self.sls_otel_akid = access_key_id self.sls_otel_aksecret = access_key_secret self.sls_otel_instanceid = instance self.local_mode = False if endpoint == "stdout": self.local_mode = True self.resource = Resource(attributes={ "host.name": socket.gethostname(), "service.name": service, "service.namespace": namespace, "service.version": version}) else: self.resource = Resource(attributes={ "host.name": socket.gethostname(), "service.name": service, "service.version": version, "service.namespace": namespace, "sls.otel.project": self.sls_otel_project, "sls.otel.akid": self.sls_otel_akid, "sls.otel.aksecret": self.sls_otel_aksecret, "sls.otel.instanceid": self.sls_otel_instanceid }) def initTracer(self): trace.set_tracer_provider(TracerProvider(resource=self.resource)) if self.local_mode: trace.get_tracer_provider().add_span_processor(SimpleSpanProcessor(ConsoleSpanExporter())) else: otlp_exporter = OTLPSpanExporter(endpoint=self.sls_otel_endpoint) trace.get_tracer_provider().add_span_processor(BatchSpanProcessor(otlp_exporter)) # tulis ke sls sls_ot_provider = OpenTelemetrySLSProvider(namespace="${service.namespace}", service="${service}", version="${version}", endpoint='${endpoint}', project="${project}", instance="${instance}", access_key_id="${access-key-id}", access_key_secret="${access-key-secret}" ) # untuk debug konsol #sls_ot_provider = OpenTelemetrySLSProvider(service="example", version="v0.1.0") # Contoh Jejak sls_ot_provider.initTracer() tracer = trace.get_tracer(__name__) with tracer.start_as_current_span("foo"): print("Hello world!") labels = {"environment": "staging"} time.sleep(60)
FAQ
Bagaimana cara memeriksa apakah OpenTelemetry SDK untuk Python diinstal dengan benar?
Gunakan kode sampel berikut untuk memeriksa instalasi. Simpan kode sebagai file tracing.py. Kemudian, jalankan perintah tracing.py. Jika keluaran sesuai harapan, dependensi terkait OpenTelemetry SDK untuk Python telah diinstal.
# tracing-example-1.py
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import (
ConsoleSpanExporter,
SimpleSpanProcessor,
)
trace.set_tracer_provider(TracerProvider())
trace.get_tracer_provider().add_span_processor(
SimpleSpanProcessor(ConsoleSpanExporter())
)
tracer = trace.get_tracer(__name__)
with tracer.start_as_current_span("foo"):
print("Hello world!")