ログストリーミング: Coralogix
- English
- 日本語
Fastly のリアルタイムログストリーミング機能によって、Coralogix にログファイルを送信することができます。Coralogix は動的アラート、比率ベースのアラート、フローの異常検出、そして 脅威発見機能などで異常な動作を検出できる分析プラットフォームを提供しています。
Fastly ではサードパーティのサービスに関する設定等のサポートは行っておりません。詳細は Fastly's Terms of Service をご参照ください。
前提条件
まだ Coralogix のアカウントをお持ちでない場合、Coralogix の Web サイトの登録手順に従ってアカウントを登録する必要があります。登録が完了したら、Coralogix のダッシュボードの Settings セクションにある Send Your Logs エリアに移動し、固有の秘密鍵をメモします。この秘密鍵は、Coralogix がお客様が送信したデータをお客様のアカウントと関連付けるために使用します。そのため、Fastly でエンドポイントを設定する際に必要となります。
Coralogix をログエンドポイントとして追加する
以下の手順で、Coralogix をログエンドポイントとして追加します。
- Deliver サービス
- Compute サービス
リモートログストリーミングの設定に関するガイドの情報をご確認ください。
- HTTPS エリアで、Create endpoint をクリックします。
- Create an HTTPS endpoint フィールドに次のように入力します。
Name フィールドに、エンドポイントの分かりやすい名前を入力します。
Placement エリアで、生成された VCL のどこにログコールを配置するかを選択します。有効な値は、形式のバージョンのデフォルトとなしです。詳細については、ログの配置の変更に関するガイドをご覧ください。
- Log format フィールドで、プレースホルダーとして入力されているログ形式を、以下の推奨されるログ形式とフィールド設定に示すように適切に変更してください。
- URL フィールドに、Coralogix Domain の Coralogix REST API Singles Endpoint を入力します。 例えば
coralogix.usというドメインの場合、https://ingress.coralogix.us/logs/v1/singlesと入力します。 - Maximum logs フィールドは、デフォルトの値である
0のままにしておきます。 - Maximum bytes フィールドに、
2000000を入力します。
- Advanced options をクリックして、以下のようにフィールドにすべて入力します。
- Content type フィールドに
application/jsonを入力します。 - Custom header name フィールドに
Authorizationを入力します。 - Custom header value フィールドに
Bearer <your Coralogix private key>を入力します。 - Method コントロールから、POST を選択します。
- JSON log entry format コントロールから、Array of JSON を選択します。
- Select a log line format コントロールはデフォルトのままにします。
- 残りのフィールドは空白のままにします。
- Content type フィールドに
Create をクリックして、新しいログ記録エンドポイントを作成します。
Activate メニューから、Activate on Production を選択して、設定の変更をデプロイします。
推奨されるログ形式とフィールド設定
以下のログ形式を使用します。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990{ "timestamp":%{time.start.msec}V, "applicationName":"fastly", "subsystemName":"%{req.service_id}V", "severity": 3, "json": { "time": { "start":"%{begin:%Y-%m-%dT%H:%M:%S%Z}t", "end":"%{end:%Y-%m-%dT%H:%M:%S%Z}t", "elapsed":%D }, "cdn_server": { "ip_ipaddr":"%A", "code":"%{server.datacenter}V", "hostname":"%{server.hostname}V", "region_code":"%{server.region}V", "response_state":"%{fastly_info.state}V", "is_h2":%{if(fastly_info.is_h2, "true", "false")}V, "is_h2_push":%{if(fastly_info.h2.is_push, "true", "false")}V, "h2_stream_id":"%{fastly_info.h2.stream_id}V" }, "client": { "city_name":"%{client.geo.city.utf8}V", "country_code":"%{client.geo.country_code}V", "country_name":"%{client.geo.country_name}V", "continent_code":"%{client.geo.continent_code}V", "region":"%{client.geo.region}V", "ip_ipaddr":"%h", "name":"%{client.as.name}V", "number":"%{client.as.number}V", "connection_speed":"%{client.geo.conn_speed}V", "location_geopoint": { "lat":%{client.geo.latitude}V, "lon":%{client.geo.longitude}V } }, "response": { "status":%>s, "content_type":"%{Content-Type}o", "age":"%{Age}o", "cache_control":"%{Cache-Control}o", "expires":"%{Expires}o", "last_modified":"%{Last-Modified}o", "tsv":"%{TSV}o", "header_size":%{resp.header_bytes_written}V, "body_size":%B }, "request": { "host":"%{req.http.host}V", "is_ipv6":%{if(req.is_ipv6, "true", "false")}V, "backend":"%{req.backend}V", "service_id":"%{req.service_id}V", "url":"%{cstr_escape(req.url)}V", "url_ext":"%{req.url.ext}V", "header_size":%{req.header_bytes_read}V, "body_size":%{req.body_bytes_read}V, "method":"%m", "protocol":"%H", "referer":"%{Referer}i", "user_agent":"%{User-Agent}i", "accept_content":"%{Accept}i", "accept_language":"%{Accept-Language}i", "accept_encoding":"%{Accept-Encoding}i", "accept_charset":"%{Accept-Charset}i", "connection":"%{Connection}i", "dnt":"%{DNT}i", "forwarded":"%{Forwarded}i", "via":"%{Via}i", "cache_control":"%{Cache-Control}i", "x_requested_with":"%{X-Requested-With}i", "x_att_device_id":"%{X-ATT-Device-Id}i", "x_forwarded_for":"%{X-Forwarded-For}i" }, "socket": { "cwnd":%{client.socket.cwnd}V, "pace":%{client.socket.pace}V, "nexthop":"%{client.socket.nexthop}V", "tcpi_rcv_mss":%{client.socket.tcpi_rcv_mss}V, "tcpi_snd_mss":%{client.socket.tcpi_snd_mss}V, "tcpi_rtt":%{client.socket.tcpi_rtt}V, "tcpi_rttvar":%{client.socket.tcpi_rttvar}V, "tcpi_rcv_rtt":%{client.socket.tcpi_rcv_rtt}V, "tcpi_rcv_space":%{client.socket.tcpi_rcv_space}V, "tcpi_last_data_sent":%{client.socket.tcpi_last_data_sent}V, "tcpi_total_retrans":%{client.socket.tcpi_total_retrans}V, "tcpi_delta_retrans":%{client.socket.tcpi_delta_retrans}V, "ploss":%{client.socket.ploss}V } }}以下の推奨される形式の最初の5つのフィールドの入力は必須です。
timestamp: このフィールドの形式は変更しないでください。applicationName: このフィールドにはアプリケーションの名前を入力してください。subsystemName: このフィールドにサブシステムの名前を入力してください。これは、コンポーネントを分離するために使用されます。例ではreq.service_idを使用していますが、これは対人可読媒体ではありません。サブシステムを識別するのに分かりやすい、意味のあるサブシステム名を使用してください。severity: 重大度を指定し、以下の選択肢を使用してすべてのログに適用することができます: 1 (デバッグ、debug)、2 (詳細、verbose)、3 (情報、info)、4 (警告、warning)、5 (エラー、error)、6 (危機的、critical)。これは後から、後述の抽出ルールを使って変更することができます。json (object): 必要に応じてフィールドを追加または削除してください。静的フィールドを追加することができます。Fastly VCL リファレンス に記載されているフィールドを含む、ネスト化された JSON 形式がサポートされています。ネストされた
response.statusフィールドの指定は、リクエストのサービスを特定するための便利な方法です。Coralogix 解析ルールを使用すると、ログのステータスコード値で Coralogix インターフェイスの重大度フィールドにデータを入力するように JSON 抽出ルールを設定することができます。具体的には、HTTP ステータスコードを重大度の値を自動的にマッピングすることができます。例えば、ステータスコード2xxは Coralogix の重大度を "INFO" とし、 ステータスコード4xxは Coralogix の重大度を "ERROR" とします。Coralogix コントロールパネルでは、以下のように表示されます。

Compute でリモートログストリーミングを設定する方法に関するガイドの情報を確認してください。また、開発者向けドキュメントには、サポートされている言語で書かれた Compute コードを含む、ログ機能に関する情報の詳細が記載されています。
- HTTPS エリアで、Create endpoint をクリックします。
- Create an HTTPS endpoint フィールドに次のように入力します。
Name フィールドに、エンドポイントの分かりやすい名前を入力します。
Placement エリアで、生成された VCL のどこにログコールを配置するかを選択します。有効な値は、形式のバージョンのデフォルトとなしです。詳細については、ログの配置の変更に関するガイドをご覧ください。
- URL フィールドに、Coralogix Domain の Coralogix REST API Singles Endpoint を入力します。 例えば
coralogix.usというドメインの場合、https://ingress.coralogix.us/logs/v1/singlesと入力します。 - Maximum logs フィールドは、デフォルトである
0のままにします。 - Maximum bytes フィールドに、
2000000を入力します。
- Advanced options をクリックして、以下のようにフィールドにすべて入力します。
- Content type フィールドに
application/jsonを入力します。 - Custom header name フィールドに
private_keyを入力します。 - Custom header value フィールドに、Coralogix の秘密鍵を入力します。
- Method コントロールから、POST を選択します。
- JSON log entry format コントロールから、Array of JSON を選択します。
- Select a log line format コントロールはデフォルトのままにします。
- TLS hostname、TLS CA certificate、TLS client certificate、およびTLS client key フィールドを空欄のままにします。
- Content type フィールドに
Create をクリックして、新しいログ記録エンドポイントを作成します。
Activate メニューから、Activate on Production を選択して、設定の変更をデプロイします。
推奨されるログ形式
Coralogix に送信されるデータは、Coralogix の期待値に適合する方法でシリアル化する必要があります。ログが正しい形式でない場合、Coralogix エンドポイントによるログ処理の試行が失敗する可能性があります。以下は、Coralogix にデータを送信する書式指定文字列の例です。
123456789101112{ "timestamp": 1653088964764, "applicationName": "fastly", "subsystemName": "wasm", "severity": 3, "json": { "message": "Request happened", "response": { "status":200 } }}Compute サービスに選択した言語に関係なく、上記の一般的な JSON 構造に従うことができます。以下のフィールドは必須です。
timestamp: このフィールドの形式はミリ秒です。applicationName: アプリケーション名を入力します。subsystemName: サブシステム名を入力します。これは、コンポーネントを分離するために使用されます。サブシステムを識別するのに分かりやすい、意味のあるサブシステム名を使用してください。severity: すべてのログの重大度です。1 (デバッグ、debug)、2 (詳細、verbose)、3 (情報、info)、4 (警告、warning)、5 (エラー、error)、 および 6 (危機的、critical) のいずれかを選択して指定することができます。これは、以下のフィールドで説明されているように、抽出ルールを利用して変更することができます。json (object): 必要に応じて、ログの詳細を指定するために使用します。ネストされた JSON 形式はサポートされます。ネストされた
response.statusフィールドの指定は、リクエストのサービスを特定するための便利な方法です。Coralogix 解析ルールを使用すると、ログのステータスコード値で Coralogix インターフェイスの重大度フィールドにデータを入力するように JSON 抽出ルールを設定することができます。具体的には、HTTP ステータスコードを重大度の値を自動的にマッピングすることができます。例えば、ステータスコード2xxは Coralogix の重大度を "INFO" とし、 ステータスコード4xxは Coralogix の重大度を "ERROR" とします。Coralogix コントロールパネルでは、以下のように表示されます。

Coralogix ダッシュボードとアラートの設定
Coralogix は、ダッシュボードやアラートを介して Fastly と自社サービスを統合するためのチュートリアルを提供しています。サービスの概要、ビジターの内訳、サービスの質など、Fastly のデータを使って作成されたデータダッシュボードの例が掲載されています。
チュートリアルでは、Fastly からのログの受信問題、オリジンでの障害、エラー率やキャッシュミスの増加、様々な異常や疑わしいリクエスト、Web サイトの改ざんなどの状況に応じてユーザー定義アラート設定する方法も説明されています。