0
0

More than 3 years have passed since last update.

非同期でも分散トーレス! CloudTasksとCloudTraceを連携させる

Posted at

はじめに

Googleの分散トレースモニタリングのCloudTraceはOpenCensusをベースというかその元になっているので、同様に非同期処理であってもちゃんとトレーシング出来ます。

なので、CloudTasksを使って非同期処理を今回実装したのですが、マニュアルとかにやり方が書いてなくて少し嵌ったのでメモ。

やり方

まずはCloudTasksをJavaで実行するコード。これは基本的にはチュートリアル通りです。

try ( var client = CloudTasksClient.create()) {
    var queuePath = QueueName.of(projectId, locationId, queueId).toString();

    var traceparent = getTraceparent();
    var taskBuilder = Task.newBuilder()
            .setHttpRequest(HttpRequest.newBuilder()
                    .putHeaders("traceparent", traceparent)
                    .setUrl("http://locahost:9000")
                    .setHttpMethod(HttpMethod.GET)
                    .build());

    // Send create task request.
    var task = client.createTask(queuePath, taskBuilder.build());
    logger.debug("task-create", $("taskid", task.getName()));
}

ポイントはHTTPヘッダにtraceparentを使っていることです。以前の記事にも書きましたが、これでコンテキストを伝搬してやらないと、リクエスト自体は反映されるものの一連のリクエストとしてCloudTrace側で認識できません。

そのため、以下のようなコードで現在のSpanからtraceparentを生成します。

private static final Setter<Map<String, String>> setter = new Setter<Map<String, String>>() {
    @Override
    public void put(Map<String, String> carrier, String key, String value) {
        carrier.put(key, value);
    }
};

public String getTraceparent() {
    var traceContextFormat = new TraceContextFormat();

    var current = Tracing.getTracer().getCurrentSpan().getContext();
    var carrier = new LinkedHashMap<String, String>();
    traceContextFormat.inject(
            SpanContext.create(current.getTraceId(), current.getSpanId(), current.getTraceOptions(), current.getTracestate()),
            carrier,
            setter);
    var traceparent = carrier.get("traceparent");

    return traceparent;
}

前提としてopencensus-apiを依存に入れておく必要があります。

traceparentのメインはTraceContextFormatSetter<Map<String, String>>です。こいつにSpanのトレースIDやスパンIDを渡す事で下記のフォーマットで変換してくれます。

image.png

自前で、作っても良いのですが微妙にフォーマットがめんどくさいので既存のコードを使わない理由も特にないでしょう。

これで、以下のように非同期処理もちゃんとトレースされました。
image.png

参考:

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0