ログストリーミング: New Relic OTLP

Fastly のリアルタイムログストリーミング機能によって、New Relic OTLP にログファイルを送信することができます。

注意

Fastly ではサードパーティのサービスに関する直接のサポートは行っておりません。詳細については、Fastly のご利用規約をご覧ください。

前提条件

Fastly サービスのログエンドポイントとして New Relic OTLP を追加する前に、以下が必要です。

ログエンドポイントとして New Relic OTLP を追加する

以下の手順で New Relic OTLP をログエンドポイントとして追加します。

  1. Deliver サービス
  2. Compute サービス
  1. リモートログストリーミングの設定に関するガイドをご確認ください。
  2. New Relic OTLP エリアで、Create endpoint をクリックします。
  3. 以下の要領で Create a New Relic OTLP endpoint ページの各フィールドに入力します。
    • Name フィールドに分かりやすいエンドポイントの名前を入力します。
    • License key / Insert key フィールドに、New Relic のライセンスキーまたは Insert API キーを入力します。
    • Region コントロールから、ログを配信するリージョンを選択します。
  4. (オプション) New Relic Infinite Tracing を使用している場合は、Advanced options をクリックし、Trace Observer URL フィールドに New Relic Trace Observer URL を入力します。
  5. Create をクリックして新規のログエンドポイントを作成します。
  6. Activate をクリックして設定への変更をデプロイします。
  7. 以下の手順に従って、VCL サービスを測定してください。

VCL サービスの測定

エンドポイントを設定した後で、カスタム VCL を追加してデータを収集し、エッジで Open Telemetry トレースを生成する必要があります。

  1. カスタム VCL ファイルの最上部に、以下の機能を配置します。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    sub time_now_ns STRING {
    declare local var.time_now INTEGER;
    set var.time_now = std.atoi(time.start.usec);
    set var.time_now += std.atoi(time.elapsed.usec);
    set var.time_now *= 1000;
    return var.time_now;
    }
    sub random_8bit_identifier STRING {
    declare local var.id STRING;
    set var.id = randomstr(16, "0123456789abcdef");
    return var.id;
    }
    sub random_16bit_identifier STRING {
    declare local var.id STRING;
    set var.id = randomstr(32, "0123456789abcdef");
    return var.id;
    }
    sub otel_resource STRING {
    declare local var.str STRING;
    set var.str = {"{ "attributes": [ "}
    {"{ "key": "service.name", "value": { "stringValue": "Fastly www" } }, "}
    {"{ "key": "telemetry.sdk.language", "value": { "stringValue": "vcl" } }, "}
    {"{ "key": "telemetry.sdk.name", "value": { "stringValue": "opentelemetry" } }, "}
    {"{ "key": "telemetry.sdk.version", "value": { "stringValue": "1.0.1" } }, "}
    {"{ "key": "host.name", "value": { "stringValue": ""} server.identity {"" } }"}
    {"], "droppedAttributesCount": 0 }"};
    return var.str;
    }
    sub otel_attributes_general STRING {
    declare local var.data STRING;
    set var.data = ""
    {"{ "key": "http.method", "value": { "stringValue": ""} req.method {"" } },"}
    {"{ "key": "http.target", "value": { "stringValue": ""} req.url {"" } },"}
    {"{ "key": "http.host", "value": { "stringValue": ""} req.http.host {"" } },"}
    {"{ "key": "http.protocol", "value": { "stringValue": ""} req.protocol {"" } },"}
    {"{ "key": "http.client_ip", "value": { "stringValue": ""} client.ip {"" } },"}
    {"{ "key": "fastly.restarts", "value": { "stringValue": ""} req.restarts {"" } },"}
    {"{ "key": "fastly.visits_this_service", "value": { "stringValue": ""} fastly.ff.visits_this_service {"" } },"}
    {"{ "key": "fastly.server_role", "value": { "stringValue": ""} req.http.x-trace-server-role {"" } },"}
    {"{ "key": "fastly.server_ip", "value": { "stringValue": ""} server.ip {"" } },"}
    {"{ "key": "fastly.server_id", "value": { "stringValue": ""} server.identity {"" } },"}
    {"{ "key": "fastly.server_role", "value": { "stringValue": ""} req.http.x-trace-server-role {"" } },"}
    {"{ "key": "fastly.vcl_version", "value": { "stringValue": ""} req.vcl.version {"" } },"}
    {"{ "key": "fastly.pop", "value": { "stringValue": ""} server.datacenter {"" } },"}
    {"{ "key": "fastly.workspace.overflowed", "value": { "stringValue": ""} workspace.overflowed {"" } },"}
    {"{ "key": "fastly.workspace.bytes_total", "value": { "stringValue": ""} workspace.bytes_total {"" } },"}
    {"{ "key": "fastly.workspace.bytes_free", "value": { "stringValue": ""} workspace.bytes_free {"" } },"}
    ;
    return var.data;
    }
    sub telem_start_backend_fetch {
    set bereq.http.traceparent = "00-" req.http.x-trace-id + "-" + req.http.x-trace-vcl-span-id "-01";
    # Avoid leaking internal headers to backends
    unset bereq.http.x-trace-id;
    unset bereq.http.x-trace-parent-span-id;
    unset bereq.http.x-trace-server-role;
    # Leapfrog cloud service infra that creates 'ghost spans'
    set bereq.http.x-traceparent = bereq.http.traceparent;
    }
  2. 次の VCL を vcl_recv サブルーチンの先頭に追加すると、Fastly POP 内のリクエストの有効期間全体のスパンが記録されます。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if (req.restarts == 0) {
    set req.http.x-trace-vcl-span-id = random_8bit_identifier();
    if (req.http.traceparent ~ "^\d+-(\w+)-(\w+)-\d+$") {
    set req.http.x-trace-id = re.group.1;
    set req.http.x-trace-parent-span-id = re.group.2;
    } else {
    set req.http.x-trace-id = random_16bit_identifier();
    }
    set req.http.x-trace-server-role = if (fastly.ff.visits_this_service == 0, "edge", "shield");
    }
  3. 次の VCL を vcl_log サブルーチンの末尾に追加し、otel_collector_http をエンドポイントの名前で置き換えます。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    declare local var.otel_resource STRING;
    declare local var.otel_attribs STRING;
    declare local var.time_start_ns STRING;
    declare local var.time_now_ns STRING;
    set var.time_start_ns = time.start.usec "000";
    set var.time_now_ns = time_now_ns();
    set var.otel_resource = otel_resource();
    set var.otel_attribs = otel_attributes_general();
    log "syslog " req.service_id " otel_collector_http :: "
    {"{ "resourceSpans": [ { "}
    {""resource": "} var.otel_resource {", "}
    {""instrumentationLibrarySpans": [ { "spans": [ { "}
    {""traceId": ""} req.http.x-trace-id {"", "}
    {""spanId": ""} req.http.x-trace-vcl-span-id {"", "}
    if(req.http.x-trace-parent-span-id,
    {""parentSpanId": ""} req.http.x-trace-parent-span-id {"", "},
    "")
    {""name": "Fastly request processing", "}
    {""kind": 1, "}
    {""startTimeUnixNano": "} var.time_start_ns {", "}
    {""endTimeUnixNano": "} var.time_now_ns {", "}
    {""attributes": [ "}
    var.otel_attribs
    {"{ "key": "http.user_agent", "value": { "stringValue": ""} req.http.User-Agent {"" } }, "}
    {"{ "key": "http.status_code", "value": { "stringValue": ""} resp.status {"" } }"}
    {"], "}
    {""status": { "code":"} if (fastly_info.state ~ "ERROR", "2", "0") {" }, "}
    {""links": [], "}
    {""droppedLinksCount": 0"}
    {"} ] } ]"}
    {"} ] }"}
    ;
  4. telem_start_backend_fetchコールを追加し、vcl_missvcl_pass サブルーチンに配置すると、Fastly スパンの子としてバックエンドシステムで発生するスパンが表示されます。

  5. サービスを有効にします。


翻訳についての注意事項
このガイドは役に立ちましたか?

このフォームを使用して機密性の高い情報を送信しないでください。サポートが必要な場合は、サポートチームまでご連絡ください。このフォームは reCAPTCHA によって保護されており、Google のプライバシーポリシー利用規約が適用されます。