Akamai DataStream Integration

This guide explains how to ingest logs from Akamai's Datastream into Hydrolix using Stream ingestion.

Create a Stream

Let's begin by creating a stream in the Akamai portal.

  1. In the Akamai admin portal, navigate to "COMMON SERVICES", then to "DataStream".

  2. On the DataStream page, click "Create stream". You should see the following wizard:
    The create datastream wizard.

  3. In "Destination", select "Custom HTTPS".

  4. Under "type", select "DataStream 2".

  5. For the "Name" field, enter "Hydrolix".

  6. For the endpoint URL, use https://<yourhostname>/ingest/event?table=<yourproject.yourtable>&transform=akamai_transform.

  7. For "Authentication", select "basic".

  8. Under "Custom Header", select Content-Type:application/json.

  9. Check "send compressed data" to enable data compression in requests.

  10. On the "Data sets" page, use the default options for all fields except for log format. For the log format, select "Json".
    Selecting the "Json" log format in the Akamai portal.

  11. On the "Summary" page, click "Save stream" to create the stream.
    Selecting the "Save stream" button in the Akamai portal.

Configure the Transform

By default, DataStream 2 sends the following fields in each message:

{
  "version": 1,
  "customField": "any-custom-value",
  "reqId": "1239f220",
  "reqTimeSec": "1573840000",
  "city": "HERNDON",
  "state": "Virginia",
  "country": "US",
  "cacheStatus": "1",
  "breadcrumbs": "//BC/%5Ba=6.7.8.9,c=g,k=0,l=1%5D",
  "dnsLookupTimeMSec": "50",
  "transferTimeMSec": "125",
  "turnAroundTimeMSec": "11",
  "errorCode": "ERR_ACCESS_DENIED|fwd_acl",
  "reqEndTimeMSec": "3",
  "xForwardedFor": "1.2.3.4",
  "maxAgeSec": "3600",
  "referer": "https%3A%2F%2Ftest.referrer.net%2Fen-US%2Fdocs%2FWeb%2Ftest",
  "range": "37334-42356",
  "cookie": "cookie-content",
  "accLang": "en-US",
  "reqPort": "443",
  "reqPath": "/path1/path2/file.ext",
  "reqMethod": "GET",
  "reqHost": "test.hostname.net",
  "proto": "HTTPS",
  "statusCode": "206",
  "cliIP": "4.5.6.7",
  "cp": "123456",
  "bytes": "4995",
  "rspContentLen": "5000",
  "rspContentType": "text/html",
  "UA": "Mozilla%2F5.0+%28Macintosh%3B+Intel+Mac+OS+X+10_14_3%29",
  "tlsOverheadTimeMSec": "0",
  "tlsVersion": "TLSv1",
  "objSize": "484",
  "uncompressedSize": "484",
  "overheadBytes": "232",
  "totalBytes": "0",
  "queryStr": "param=value"
}

Separate Breadcrumbs into Discrete Columns

Breadcrumbs data arrives URL-encoded. We can use Hydrolix's built-in enrichment to decode breadcrumbs and separate out the different pieces of information contained within.

Consider the following example of breadcrumb data:

//BC/[a=6.7.8.9,c=g,k=0,l=1]

This string contains the following pieces of discrete information:

  • a=6.7.8.9 is a component IP
  • c=g is the edge ghost
  • k=0 is the request end time in milliseconds
  • l=1 is the turnaround time in milliseconds

Because you might want to query or monitor any of these fields individually, it makes sense to separate out each piece of data into a column in our table. Fortunately, Hydrolix enables you to enrich data with SQL statements at indexing time. Consider the following SQL statement that extracts the Edge IP:

SELECT extract(
  extract(decodeURLComponent(breadcrumbs), '(\[[^[]*c=g[^]]*\])'),
  'a=([^,\]]+)') AS Edge_IP
  1. The decodeURLComponent() method translates the breadcrumbs from URL encoding into a string.
  2. The extract() method uses a regex to extract all of the data between the open and close brackets ([ and ]).
  3. A second extract() method call extracts the value after a=.
  4. We output the results to the Edge_IP column.

Enrichment SQL

You can use the following collection of SQL statements to decode all of the other fields:

SELECT now() - reqTimeSec as latency,
decodeURLComponent(assumeNotNull(UA)) as UA,
decodeURLComponent(assumeNotNull(state)) as state,
extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '\/\/BC\/(\S*)') as breadcrumbs,
extract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(\[[^[]*c=g[^]]*\])'), 'a=([^,\]]+)') as Edge_IP,
extract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(\[[^[]*c=g[^]]*\])'), 'b=([^,\]]+)') as Edge_RequestID,
extract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(\[[^[]*c=g[^]]*\])'), 'k=([^,\]]+)') as Edge_RequestEndTime,
extract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(\[[^[]*c=g[^]]*\])'), 'l=([^,\]]+)') as Edge_TurnAroundTime,
extract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(\[[^[]*c=g[^]]*\])'), 'm=([^,\]]+)') as Edge_DNSLookupTime,
extract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(\[[^[]*c=g[^]]*\])'), 'n=([^,\]]+)') as Edge_GeoInfo,
extract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(\[[^[]*c=g[^]]*\])'), 'o=([^,\]]+)') as Edge_ASN,
extract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(\[[^[]*c=o[^]]*\])'), 'a=([^,\]]+)') as Origin_IP,
extract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(\[[^[]*c=o[^]]*\])'), 'b=([^,\]]+)') as Origin_RequestID,
extract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(\[[^[]*c=o[^]]*\])'), 'k=([^,\]]+)') as Origin_RequestEndTime,
extract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(\[[^[]*c=o[^]]*\])'), 'l=([^,\]]+)') as Origin_TurnAroundTime,
extract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(\[[^[]*c=o[^]]*\])'), 'm=([^,\]]+)') as Origin_DNSLookupTime,
extract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(\[[^[]*c=o[^]]*\])'), 'n=([^,\]]+)') as Origin_GeoInfo,
extract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(\[[^[]*c=o[^]]*\])'), 'o=([^,\]]+)') as Origin_ASN,
extract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(,\[[^[]*c=p[^]]*\])'), 'a=([^,\]]+)') as Peer_IP,
extract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(,\[[^[]*c=p[^]]*\])'), 'b=([^,\]]+)') as Peer_RequestID,
extract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(,\[[^[]*c=p[^]]*\])'), 'k=([^,\]]+)') as Peer_RequestEndTime,
extract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(,\[[^[]*c=p[^]]*\])'), 'l=([^,\]]+)') as Peer_TurnAroundTime,
extract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(,\[[^[]*c=p[^]]*\])'), 'm=([^,\]]+)') as Peer_DNSLookupTime,
extract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(,\[[^[]*c=p[^]]*\])'), 'n=([^,\]]+)') as Peer_GeoInfo,
extract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(,\[[^[]*c=p[^]]*\])'), 'o=([^,\]]+)') as Peer_ASN,
extract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(,\[[^[]*c=c[^]]*\])'), 'a=([^,\]]+)') as Parent_IP,
extract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(,\[[^[]*c=c[^]]*\])'), 'b=([^,\]]+)') as Parent_RequestID,
extract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(,\[[^[]*c=c[^]]*\])'), 'k=([^,\]]+)') as Parent_RequestEndTime,
extract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(,\[[^[]*c=c[^]]*\])'), 'l=([^,\]]+)') as Parent_TurnAroundTime,
extract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(,\[[^[]*c=c[^]]*\])'), 'm=([^,\]]+)') as Parent_DNSLookupTime,
extract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(,\[[^[]*c=c[^]]*\])'), 'n=([^,\]]+)') as Parent_GeoInfo,
extract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(,\[[^[]*c=c[^]]*\])'), 'o=([^,\]]+)') as Parent_ASN,
extract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(,\[[^[]*c=w[^]]*\])'), 'a=([^,\]]+)') as CloudWrapper_IP,
extract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(,\[[^[]*c=w[^]]*\])'), 'b=([^,\]]+)') as CloudWrapper_RequestID,
extract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(,\[[^[]*c=w[^]]*\])'), 'k=([^,\]]+)') as CloudWrapper_RequestEndTime,
extract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(,\[[^[]*c=w[^]]*\])'), 'l=([^,\]]+)') as CloudWrapper_TurnAroundTime,
extract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(,\[[^[]*c=w[^]]*\])'), 'm=([^,\]]+)') as CloudWrapper_DNSLookupTime,
extract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(,\[[^[]*c=w[^]]*\])'), 'n=([^,\]]+)') as CloudWrapper_GeoInfo,
extract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(,\[[^[]*c=w[^]]*\])'), 'o=([^,\]]+)') as CloudWrapper_ASN,
* FROM {STREAM}

This results in the following set of columns and values for the above example:

{
  "CloudWrapper_ASN": null,
  "CloudWrapper_DNSLookupTime": null,
  "CloudWrapper_GeoInfo": "",
  "CloudWrapper_IP": "",
  "CloudWrapper_RequestEndTime": null,
  "CloudWrapper_RequestID": "",
  "CloudWrapper_TurnAroundTime": null,
  "Edge_ASN": null,
  "Edge_DNSLookupTime": "",
  "Edge_GeoInfo": "",
  "Edge_IP": "6.7.8.9",
  "Edge_RequestEndTime": 0,
  "Edge_RequestID": "",
  "Edge_TurnAroundTime": 1,
  "Origin_ASN": null,
  "Origin_DNSLookupTime": "",
  "Origin_GeoInfo": "",
  "Origin_IP": "",
  "Origin_RequestEndTime": "",
  "Origin_RequestID": "",
  "Origin_TurnAroundTime": "",
  "Parent_ASN": null,
  "Parent_DNSLookupTime": null,
  "Parent_GeoInfo": "",
  "Parent_IP": "",
  "Parent_RequestEndTime": null,
  "Parent_RequestID": "",
  "Parent_TurnAroundTime": null,
  "Peer_ASN": null,
  "Peer_DNSLookupTime": null,
  "Peer_GeoInfo": "",
  "Peer_IP": "",
  "Peer_RequestEndTime": null,
  "Peer_RequestID": "",
  "Peer_TurnAroundTime": null,
  "latency": 96,
  "version": 1,
  "customField": "any-custom-value",
  "reqId": "1239f220",
  "reqTimeSec": "2019-11-15 17:46:40",
  "city": "HERNDON",
  "state": "Virginia",
  "country": "US",
  "cacheStatus": "1",
  "breadcrumbs": "[a=6.7.8.9,c=g,k=0,l=1]",
  "dnsLookupTimeMSec": "50",
  "transferTimeMSec": "125",
  "turnAroundTimeMSec": "11",
  "errorCode": "ERR_ACCESS_DENIED|fwd_acl",
  "reqEndTimeMSec": "3",
  "xForwardedFor": "1.2.3.4",
  "maxAgeSec": "3600",
  "referer": "https://test.referrer.net/en-US/docs/Web/test",
  "range": "37334-42356",
  "cookie": "cookie-content",
  "accLang": "en-US",
  "reqPort": "443",
  "reqPath": "/path1/path2/file.ext",
  "reqMethod": "GET",
  "reqHost": "test.hostname.net",
  "proto": "HTTPS",
  "statusCode": "206",
  "cliIP": "4.5.6.7",
  "cp": "123456",
  "bytes": "4995",
  "rspContentLen": "5000",
  "rspContentType": "text/html",
  "UA": "Mozilla/5.0+(Macintosh;+Intel+Mac+OS+X+10_14_3)",
  "tlsOverheadTimeMSec": "0",
  "tlsVersion": "TLSv1",
  "objSize": "484",
  "uncompressedSize": "484",
  "overheadBytes": "232",
  "totalBytes": "0",
  "queryStr": "param=value"
}

Example Transform

Before you can process data from Akamai, you'll need a transform to process the incoming data into your schema. The following transform handles DataStream 2 logs:

{
  "name": "akamai_transform",
  "description": "DataStream 2 Transform",
  "settings": {
    "is_default": true,
    "sql_transform": "SELECT now() - reqTimeSec as latency,\ndecodeURLComponent(assumeNotNull(UA)) as UA,\ndecodeURLComponent(assumeNotNull(referer)) as referer,\ndecodeURLComponent(assumeNotNull(queryStr)) as queryStr,\nextract(decodeURLComponent(assumeNotNull(breadcrumbs)), '\\\\\\/\\\\\\/BC\\\\\\/(\\\\S*)') as breadcrumbs,\nextract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(\\\\[[^[]*c=g[^]]*\\\\])'), 'a=([^,\\\\]]+)') as Edge_IP,\nextract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(\\\\[[^[]*c=g[^]]*\\\\])'), 'b=([^,\\\\]]+)') as Edge_RequestID,\nextract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(\\\\[[^[]*c=g[^]]*\\\\])'), 'k=([^,\\\\]]+)') as Edge_RequestEndTime,\nextract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(\\\\[[^[]*c=g[^]]*\\\\])'), 'l=([^,\\\\]]+)') as Edge_TurnAroundTime,\nextract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(\\\\[[^[]*c=g[^]]*\\\\])'), 'm=([^,\\\\]]+)') as Edge_DNSLookupTime,\nextract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(\\\\[[^[]*c=g[^]]*\\\\])'), 'n=([^,\\\\]]+)') as Edge_GeoInfo,\nextract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(\\\\[[^[]*c=g[^]]*\\\\])'), 'o=([^,\\\\]]+)') as Edge_ASN,\nextract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(\\\\[[^[]*c=o[^]]*\\\\])'), 'a=([^,\\\\]]+)') as Origin_IP,\nextract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(\\\\[[^[]*c=o[^]]*\\\\])'), 'b=([^,\\\\]]+)') as Origin_RequestID,\nextract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(\\\\[[^[]*c=o[^]]*\\\\])'), 'k=([^,\\\\]]+)') as Origin_RequestEndTime,\nextract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(\\\\[[^[]*c=o[^]]*\\\\])'), 'l=([^,\\\\]]+)') as Origin_TurnAroundTime,\nextract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(\\\\[[^[]*c=o[^]]*\\\\])'), 'm=([^,\\\\]]+)') as Origin_DNSLookupTime,\nextract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(\\\\[[^[]*c=o[^]]*\\\\])'), 'n=([^,\\\\]]+)') as Origin_GeoInfo,\nextract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(\\\\[[^[]*c=o[^]]*\\\\])'), 'o=([^,\\\\]]+)') as Origin_ASN,\nextract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(,\\\\[[^[]*c=p[^]]*\\\\])'), 'a=([^,\\\\]]+)') as Peer_IP,\nextract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(,\\\\[[^[]*c=p[^]]*\\\\])'), 'b=([^,\\\\]]+)') as Peer_RequestID,\nextract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(,\\\\[[^[]*c=p[^]]*\\\\])'), 'k=([^,\\\\]]+)') as Peer_RequestEndTime,\nextract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(,\\\\[[^[]*c=p[^]]*\\\\])'), 'l=([^,\\\\]]+)') as Peer_TurnAroundTime,\nextract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(,\\\\[[^[]*c=p[^]]*\\\\])'), 'm=([^,\\\\]]+)') as Peer_DNSLookupTime,\nextract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(,\\\\[[^[]*c=p[^]]*\\\\])'), 'n=([^,\\\\]]+)') as Peer_GeoInfo,\nextract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(,\\\\[[^[]*c=p[^]]*\\\\])'), 'o=([^,\\\\]]+)') as Peer_ASN,\nextract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(,\\\\[[^[]*c=c[^]]*\\\\])'), 'a=([^,\\\\]]+)') as Parent_IP,\nextract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(,\\\\[[^[]*c=c[^]]*\\\\])'), 'b=([^,\\\\]]+)') as Parent_RequestID,\nextract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(,\\\\[[^[]*c=c[^]]*\\\\])'), 'k=([^,\\\\]]+)') as Parent_RequestEndTime,\nextract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(,\\\\[[^[]*c=c[^]]*\\\\])'), 'l=([^,\\\\]]+)') as Parent_TurnAroundTime,\nextract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(,\\\\[[^[]*c=c[^]]*\\\\])'), 'm=([^,\\\\]]+)') as Parent_DNSLookupTime,\nextract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(,\\\\[[^[]*c=c[^]]*\\\\])'), 'n=([^,\\\\]]+)') as Parent_GeoInfo,\nextract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(,\\\\[[^[]*c=c[^]]*\\\\])'), 'o=([^,\\\\]]+)') as Parent_ASN,\nextract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(,\\\\[[^[]*c=w[^]]*\\\\])'), 'a=([^,\\\\]]+)') as CloudWrapper_IP,\nextract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(,\\\\[[^[]*c=w[^]]*\\\\])'), 'b=([^,\\\\]]+)') as CloudWrapper_RequestID,\nextract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(,\\\\[[^[]*c=w[^]]*\\\\])'), 'k=([^,\\\\]]+)') as CloudWrapper_RequestEndTime,\nextract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(,\\\\[[^[]*c=w[^]]*\\\\])'), 'l=([^,\\\\]]+)') as CloudWrapper_TurnAroundTime,\nextract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(,\\\\[[^[]*c=w[^]]*\\\\])'), 'm=([^,\\\\]]+)') as CloudWrapper_DNSLookupTime,\nextract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(,\\\\[[^[]*c=w[^]]*\\\\])'), 'n=([^,\\\\]]+)') as CloudWrapper_GeoInfo,\nextract(extract(decodeURLComponent(assumeNotNull(breadcrumbs)), '(,\\\\[[^[]*c=w[^]]*\\\\])'), 'o=([^,\\\\]]+)') as CloudWrapper_ASN,\nassumeNotNull(decodeURLComponent(queryStr)) as url_cmcd,\nif(startsWith(url_cmcd, 'CMCD='), substring(url_cmcd, 6), url_cmcd) as url,\nflatten(extractAllGroupsVertical(assumeNotNull(url), '([^=,\\\"]+)=\\\"?([^,=\\\"]+)\\\"? ?')) as groups,\nakamai_cmcd_query_param('bl', groups) as cmcd_buffer_length,\nakamai_cmcd_query_param('br', groups) as cmcd_encoded_bitrate,\nakamai_cmcd_query_param('bs', groups) as cmcd_buffer_starvation,\nakamai_cmcd_query_param('cid', groups) as cmcd_content_id,\nakamai_cmcd_query_param('d', groups) as cmcd_object_duration,\nakamai_cmcd_query_param('dl', groups) as cmcd_deadline,\nakamai_cmcd_query_param('mtp', groups) as cmcd_measured_throughput,\nakamai_cmcd_query_param('nor', groups) as cmcd_next_object_requests,\nakamai_cmcd_query_param('nrr', groups) as cmcd_next_range_request,\nakamai_cmcd_object_type(akamai_cmcd_query_param('ot', groups)) as cmcd_object_type,\nakamai_cmcd_query_param('pr', groups) as cmcd_playback_rate,\nakamai_cmcd_query_param('rtp', groups) as cmcd_requested_max_throughput,\nakamai_cmcd_streaming_format(akamai_cmcd_query_param('sf', groups)) as cmcd_streaming_format,\nakamai_cmcd_query_param('sid', groups) as cmcd_session_id,\nakamai_cmcd_stream_type(akamai_cmcd_query_param('st', groups)) as cmcd_stream_type,\nakamai_cmcd_query_param('su', groups) as cmcd_startup,\nakamai_cmcd_query_param('tb', groups) as cmcd_top_bitrate,\nakamai_cmcd_query_param('v', groups) as cmcd_version,\nflatten(extractAllGroups(assumeNotNull(queryStr),'([^&]+)')) as extracted,\narrayMap(v -> splitByChar('=', v), extracted) as splitted,\narrayMap(y -> (y[1]), splitted) as key,\narrayMap(y -> (y[2]), splitted) as value,\n(key, value)::Map(String, String) AS querystring,\n* FROM {STREAM}",
    "null_values": [
      "-",
      "^",
      "-1"
    ],
    "output_columns": [
      {
        "name": "version",
        "datatype": {
          "type": "uint8"
        }
      },
      {
        "name": "streamId",
        "datatype": {
          "type": "uint32"
        }
      },
      {
        "name": "customField",
        "datatype": {
          "type": "string"
        }
      },
      {
        "name": "reqId",
        "datatype": {
          "type": "string"
        }
      },
      {
        "name": "reqTimeSec",
        "datatype": {
          "type": "epoch",
          "index": false,
          "primary": true,
          "source": null,
          "format": "s",
          "resolution": "s",
          "default": null,
          "script": null
        }
      },
      {
        "name": "city",
        "datatype": {
          "type": "string"
        }
      },
      {
        "name": "state",
        "datatype": {
          "type": "string"
        }
      },
      {
        "name": "country",
        "datatype": {
          "type": "string"
        }
      },
      {
        "name": "serverCountry",
        "datatype": {
          "type": "string"
        }
      },
      {
        "name": "billingRegion",
        "datatype": {
          "type": "uint32"
        }
      },
      {
        "name": "cacheStatus",
        "datatype": {
          "type": "boolean"
        }
      },
      {
        "name": "breadcrumbs",
        "datatype": {
          "type": "string"
        }
      },
      {
        "name": "securityRules",
        "datatype": {
          "type": "string"
        }
      },
      {
        "name": "ewUsageInfo",
        "datatype": {
          "type": "string"
        }
      },
      {
        "name": "ewExecutionInfo",
        "datatype": {
          "type": "string"
        }
      },
      {
        "name": "dnsLookupTimeMSec",
        "datatype": {
          "type": "uint32"
        }
      },
      {
        "name": "lastByte",
        "datatype": {
          "type": "boolean"
        }
      },
      {
        "name": "edgeIP",
        "datatype": {
          "type": "string"
        }
      },
      {
        "name": "transferTimeMSec",
        "datatype": {
          "type": "uint32"
        }
      },
      {
        "name": "turnAroundTimeMSec",
        "datatype": {
          "type": "uint32"
        }
      },
      {
        "name": "errorCode",
        "datatype": {
          "type": "string"
        }
      },
      {
        "name": "reqEndTimeMSec",
        "datatype": {
          "type": "uint32"
        }
      },
      {
        "name": "xForwardedFor",
        "datatype": {
          "type": "string"
        }
      },
      {
        "name": "maxAgeSec",
        "datatype": {
          "type": "uint64"
        }
      },
      {
        "name": "referer",
        "datatype": {
          "type": "string"
        }
      },
      {
        "name": "range",
        "datatype": {
          "type": "string"
        }
      },
      {
        "name": "cookie",
        "datatype": {
          "type": "string",
          "index": true,
          "index_options": {
            "fulltext": true
          }
        }
      },
      {
        "name": "accLang",
        "datatype": {
          "type": "string"
        }
      },
      {
        "name": "reqPort",
        "datatype": {
          "type": "uint32"
        }
      },
      {
        "name": "reqPath",
        "datatype": {
          "type": "string",
          "index": true,
          "index_options": {
            "fulltext": true
          }
        }
      },
      {
        "name": "reqMethod",
        "datatype": {
          "type": "string"
        }
      },
      {
        "name": "reqHost",
        "datatype": {
          "type": "string"
        }
      },
      {
        "name": "proto",
        "datatype": {
          "type": "string"
        }
      },
      {
        "name": "statusCode",
        "datatype": {
          "type": "uint32"
        }
      },
      {
        "name": "cliIP",
        "datatype": {
          "type": "string"
        }
      },
      {
        "name": "cp",
        "datatype": {
          "type": "uint32"
        }
      },
      {
        "name": "bytes",
        "datatype": {
          "type": "uint64"
        }
      },
      {
        "name": "rspContentLen",
        "datatype": {
          "type": "uint64"
        }
      },
      {
        "name": "rspContentType",
        "datatype": {
          "type": "string"
        }
      },
      {
        "name": "UA",
        "datatype": {
          "type": "string",
          "index": true,
          "index_options": {
            "fulltext": true
          }
        }
      },
      {
        "name": "tlsOverheadTimeMSec",
        "datatype": {
          "type": "uint32"
        }
      },
      {
        "name": "tlsVersion",
        "datatype": {
          "type": "string"
        }
      },
      {
        "name": "objSize",
        "datatype": {
          "type": "uint64"
        }
      },
      {
        "name": "uncompressedSize",
        "datatype": {
          "type": "uint64"
        }
      },
      {
        "name": "overheadBytes",
        "datatype": {
          "type": "uint64"
        }
      },
      {
        "name": "totalBytes",
        "datatype": {
          "type": "uint64"
        }
      },
      {
        "name": "queryStr",
        "datatype": {
          "type": "string"
        }
      },
      {
        "name": "Edge_IP",
        "datatype": {
          "type": "string",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "Edge_RequestID",
        "datatype": {
          "type": "string",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "Edge_RequestEndTime",
        "datatype": {
          "type": "uint32",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "Edge_TurnAroundTime",
        "datatype": {
          "type": "uint32",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "Edge_DNSLookupTime",
        "datatype": {
          "type": "uint32",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "Edge_GeoInfo",
        "datatype": {
          "type": "string",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "Edge_ASN",
        "datatype": {
          "type": "uint32",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "Origin_IP",
        "datatype": {
          "type": "string",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "Origin_RequestID",
        "datatype": {
          "type": "string",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "Origin_RequestEndTime",
        "datatype": {
          "type": "uint32",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "Origin_TurnAroundTime",
        "datatype": {
          "type": "uint32",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "Origin_DNSLookupTime",
        "datatype": {
          "type": "uint32",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "Origin_GeoInfo",
        "datatype": {
          "type": "string",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "Origin_ASN",
        "datatype": {
          "type": "uint32",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "Parent_IP",
        "datatype": {
          "type": "string",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "Parent_RequestID",
        "datatype": {
          "type": "string",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "Parent_RequestEndTime",
        "datatype": {
          "type": "uint32",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "Parent_TurnAroundTime",
        "datatype": {
          "type": "uint32",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "Parent_DNSLookupTime",
        "datatype": {
          "type": "uint32",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "Parent_GeoInfo",
        "datatype": {
          "type": "string",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "Parent_ASN",
        "datatype": {
          "type": "uint32",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "CloudWrapper_IP",
        "datatype": {
          "type": "string",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "CloudWrapper_RequestID",
        "datatype": {
          "type": "string",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "CloudWrapper_RequestEndTime",
        "datatype": {
          "type": "uint32",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "CloudWrapper_TurnAroundTime",
        "datatype": {
          "type": "uint32",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "CloudWrapper_DNSLookupTime",
        "datatype": {
          "type": "uint32",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "CloudWrapper_GeoInfo",
        "datatype": {
          "type": "string",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "CloudWrapper_ASN",
        "datatype": {
          "type": "uint32",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "Peer_IP",
        "datatype": {
          "type": "string",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "Peer_RequestID",
        "datatype": {
          "type": "string",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "Peer_RequestEndTime",
        "datatype": {
          "type": "uint32",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "Peer_TurnAroundTime",
        "datatype": {
          "type": "uint32",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "Peer_DNSLookupTime",
        "datatype": {
          "type": "uint32",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "Peer_GeoInfo",
        "datatype": {
          "type": "string",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "Peer_ASN",
        "datatype": {
          "type": "uint32",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "latency",
        "datatype": {
          "type": "uint32",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "cmcd_buffer_length",
        "datatype": {
          "type": "uint64",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "cmcd_encoded_bitrate",
        "datatype": {
          "type": "uint64",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "cmcd_buffer_starvation",
        "datatype": {
          "type": "uint8",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "cmcd_content_id",
        "datatype": {
          "type": "string",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "cmcd_object_duration",
        "datatype": {
          "type": "uint64",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "cmcd_deadline",
        "datatype": {
          "type": "uint64",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "cmcd_measured_throughput",
        "datatype": {
          "type": "uint64",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "cmcd_next_object_requests",
        "datatype": {
          "type": "string",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "cmcd_next_range_request",
        "datatype": {
          "type": "string",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "cmcd_object_type",
        "datatype": {
          "type": "string",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "cmcd_playback_rate",
        "datatype": {
          "type": "uint8",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "cmcd_requested_max_throughput",
        "datatype": {
          "type": "uint64",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "cmcd_streaming_format",
        "datatype": {
          "type": "string",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "cmcd_session_id",
        "datatype": {
          "type": "string",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "cmcd_stream_type",
        "datatype": {
          "type": "string",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "cmcd_startup",
        "datatype": {
          "type": "uint8",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "cmcd_top_bitrate",
        "datatype": {
          "type": "uint64",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "cmcd_version",
        "datatype": {
          "type": "uint32",
          "source": {
            "from_input_field": "sql_transform"
          }
        }
      },
      {
        "name": "querystring",
        "datatype": {
          "type": "map",
          "index": true,
          "source": {
            "from_input_field": "sql_transform"
          },
          "elements": [
            {
              "type": "string",
              "index": true
            },
            {
              "type": "string",
              "index": true
            }
          ]
        }
      },
      {
        "name": "isMidgress",
        "datatype": {
          "type": "boolean"
        }
      },
      {
        "name": "unknown",
        "datatype": {
          "type": "map",
          "index": true,
          "catch_all": true,
          "elements": [
            {
              "type": "string",
              "index": true
            },
            {
              "type": "string",
              "index": true
            }
          ]
        }
      }
    ],
    "compression": "none"
  },
  "type": "json"
}