Prerequisite
roles/cloudtrace.agent権限を、アプリケーションが使っているSAに付与しておく必要があります。
tfの場合:
resource "google_project_iam_member" "helloworld_is_cloud_trace_agent" {
project = var.project
role = "roles/cloudtrace.agent"
member = google_service_account.helloworld.member
}
コード
from opentelemetry import trace
from opentelemetry.exporter.cloud_trace import CloudTraceSpanExporter
from opentelemetry.instrumentation.flask import FlaskInstrumentor
from opentelemetry.sdk.resources import Resource
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
resource = Resource.create(
{
"service.name": "<app name>",
"version": os.getenv("VERSION", "unknown"),
"env": os.getenv("ENV", "dev"),
}
)
tracer_provider = TracerProvider(resource=resource)
trace.set_tracer_provider(tracer_provider)
cloud_trace_exporter = CloudTraceSpanExporter(resource_regex="env|version|service.name")
span_processor = BatchSpanProcessor(cloud_trace_exporter)
tracer_provider.add_span_processor(span_processor)
tracer = trace.get_tracer(__name__)
app = Flask(__name__)
FlaskInstrumentor().instrument_app(app)
@app.route("/")
def hello():
return "Hello!"
if __name__ == "__main__":
app.run(debug=True)
ポイント
- Resource名を入れることでspan attributeに値を入れてfilterを使って絞りやすくなる
- FlaskInstrumentorなど自動計装を使うと便利