Logo

CDN collectors

Fastly CDN Collector

The Fastly CDN Collector by Datazoom makes the following data points automatically collectable in real time and correlatable to data collected from Datazoom application collectors configured with a media player extension.

Configuring the Fastly logging endpoint

Follow the steps Adding HTTPS as a logging endpoint from the Fastly Documentation

Here are the configuration details:

URL

https://streaming.datazoom.io/cdn/v1/logs

Content-Type

application/json

Custom Header Name

X-Api-Key

Custom Header Value

API key from above

Method

POST

JSON log entry format

Array of JSON

Log Line format

Blank

Placement

Format Version Default

Example Log Format:

{
"time":%{time.start.sec}V,
"event": {
"service_id":"%{req.service_id}V",
"time_start":"%{begin:%Y-%m-%dT%H:%M:%S%Z}t",
"time_end":"%{end:%Y-%m-%dT%H:%M:%S%Z}t",
"time_elapsed":%D,
"client_as_number":%{client.as.number}V,
"client_city":"%{client.geo.city}V",
"client_congestion_algorithm":"%{client.socket.congestion_algorithm}V",
"client_country_code":"%{client.geo.country_code3}V",
"client_cwnd":%{client.socket.cwnd}V,
"client_delivery_rate":%{client.socket.tcpi_delivery_rate}V,
"client_ip":"%{req.http.fastly-client-ip}V",
"client_latitude":%{if(client.geo.latitude == 999.9, "null", client.geo.latitude)}V,
"client_longitude":%{if(client.geo.longitude == 999.9, "null", client.geo.longitude)}V,
"client_ploss":%{client.socket.ploss}V,
"client_requests":%{client.requests}V,
"client_retrans":%{client.socket.tcpi_delta_retrans}V,
"client_rtt":%{req.http.log-client:tcpi_rtt}V,
"client_region":"%{client.geo.region}V",
"content_type":"%{Content-Type}o",
"fastly_is_edge":%{if(fastly.ff.visits_this_service == 0, "true", "false")}V,
"fastly_is_shield":%{if(req.http.log-origin:shield == server.datacenter, "true", "false")}V,
"fastly_pop":"%{server.datacenter}V",
"fastly_server":"%{server.hostname}V",
"fastly_shield_used":%{if(req.http.log-origin:shield, "%22" + req.http.log-origin:shield + "%22", "null")}V,
"origin_host":%{if(req.http.log-origin:host,"%22" + json.escape(req.http.log-origin:host) + "%22","null")}V,
"origin_ip":%{if(req.http.log-origin:ip,"%22" + json.escape(req.http.log-origin:ip) + "%22","null")}V,
"origin_method":%{if(req.http.log-origin:method,"%22" + json.escape(req.http.log-origin:method) + "%22","null")}V,
"origin_name":%{if(req.http.log-origin:name,"%22" + json.escape(req.http.log-origin:name) + "%22","null")}V,
"origin_port":%{if(req.http.log-origin:port,req.http.log-origin:port,"null")}V,
"origin_reason":%{if(req.http.log-origin:reason,"%22" + json.escape(req.http.log-origin:reason) + "%22","null")}V,
"origin_status":%{if(req.http.log-origin:status,json.escape(req.http.log-origin:status),"null")}V,
"origin_ttfb":%{if(req.http.log-origin:ttfb == "NaN", "null", req.http.log-origin:ttfb)}V,
"origin_ttlb":%{if(req.http.log-origin:ttlb == "NaN", "null", req.http.log-origin:ttlb)}V,
"origin_url":%{if(req.http.log-origin:url,"%22" + json.escape(req.http.log-origin:url) + "%22","null")}V,
"request_host":"%{json.escape(req.http.log-request:host)}V",
"request_is_h2":%{if(fastly_info.is_h2, "true", "false")}V,
"request_is_ipv6":%{if(req.is_ipv6, "true", "false")}V,
"request_method":"%{json.escape(req.http.log-request:method)}V",
"request_tls_version":%{if(tls.client.protocol, "%22" + tls.client.protocol + "%22", "null")}V,
"request_url":"%{json.escape(req.http.log-request:url)}V",
"request_user_agent":%{if(req.http.user-agent, "%22" + json.escape(req.http.user-agent) + "%22", "null")}V,
"response_age":%{regsub(obj.age, ".000$", "")}V,
"response_bytes_body":%{resp.body_bytes_written}V,
"response_bytes_header":%{resp.header_bytes_written}V,
"response_bytes":%{resp.bytes_written}V,
"response_cache_control":%{if(resp.http.cache-control, "%22" + json.escape(resp.http.cache-control) + "%22", "null")}V,
"response_completed":%{if(resp.completed, "true", "false")}V,
"response_content_length":%{if(resp.http.content-length, resp.http.content-length, "null")}V,
"response_content_type":%{if(resp.http.content-type, "%22" + json.escape(resp.http.content-type) + "%22", "null")}V,
"response_reason":%{if(resp.response,"%22" + json.escape(resp.response) + "%22","null")}V,
"response_state":"%{fastly_info.state}V",
"response_status":%{resp.status}V,
"response_ttfb":%{req.http.log-response:ttfb}V,
"response_ttl":%{obj.ttl}V,
"response_ttlb":%{req.http.log-response:ttlb}V,
"response_x_cache":%{if(resp.http.x-cache,"%22" + json.escape(resp.http.x-cache) + "%22","null")}V
}
}

Supported Data Points

Events

Discrete occurrences driven by user interactions or system actions

Fluxdata

Metrics measuring changing parameters over time