Zuplo is a fully-managed API Gateway that can be deployed within various cloud infrastructures (AWS, GCP, Azure) as well as private data centers. Typically, it sits between clients' applications and an API. Zuplo proxies traffic from clients to the API, enforcing protections such as rate limiting, request validation, and authentication while providing an executable code layer between the API and its consumers.

You can read more about Zuplo in What is Zuplo?

This document will cover two methods of integrating Zuplo with Hydrolix.

  1. Exporting Zuplo logs to Hydrolix (Akamai TrafficPeak) using the Hydrolix / Akamai TrafficPeak Plugin from Zuplo.
  2. Integrating Zuplo as a Gateway layer in front of a Hydrolix cluster API

Import logs from Zuplo into Hydrolix

Before you begin

ItemDescriptionExample valueHow to obtain this information
Cluster hostnameThis is the hostname of your Hydrolix cluster.{hostname}.hydrolix.liveThis is the value of hydrolix_url in your hydrolixcluster.yaml without the https://.
UsernameThe username you use to access your Hydrolix cluster.[email protected]This is likely your organizational email.
PasswordThe password you use to access your Hydrolix cluster.00sekret%If you do not recall your password, use the Forgot password? option on the login page for your Hydrolix cluster.
(TrafficPeak only) Table-specific stream ingest tokenUse a table-specific stream ingest token for Zuplo to authenticate with the Hydrolix Streaming Ingest API. This is the value for the HYDROLIX_TOKEN parameter of the Zuplo plugin.example_tokenSee Configuring stream authentication settings for instructions on configuring table-specific stream ingest tokens.
(Non-TrafficPeak only, optional) OAuth bearer tokenUse an OAuth Bearer token for Zuplo to authenticate with the Hydrolix Streaming Ingest API. This is the value for the HYDROLIX_TOKEN parameter of the Zuplo plugin. This can be used as an alternative to a table-specific stream ingest token, though both are valid for stream ingest authentication.eyXrxkzoN2fRiiKpnV...Follow these instructions to generate an OAuth bearer token.
Table nameThis is the destination to which you will route data from your Zuplo instance. You will need the name of the table you want to store Zuplo data in using the format project_name.table_name.zuplo_project.zuplo_tableFollow these instructions to create a table.

Register a Hydrolix Transform

You will need to register a Hydrolix transform. The transform determines how your Zuplo data will be mapped onto your Hydrolix table. You will also need to specify the transform name (zuplojson) within the zuplo.runtime.ts file in a later step.

Reference the Publish Your Transform page for creating and publishing a transform. The following example transform is compatible with the default set of Zuplo logs. To correctly map custom Zuplo log output, the transform may need to be altered.

Zuplo default log output transform

Configure the Hydrolix plugin

Follow the instructions to set up the Hydrolix / Akamai Traffic Peak Plugin. You will need the information specified in Before you begin to configure the zuplo.runtime.ts file.

Add Grafana dashboards (optional)

You can create Grafana dashboards for the default Zuplo logs using the following instructions and dashboard JSON objects.

  1. Save one of the JSON object files from the links below.
  2. Login to your Grafana instance.
  3. Open Dashboards in the left-hand nav.
  4. Select New > New Dashboard.
  5. Select Import Dashboard.
  6. Select Upload dashboard JSON file.
  7. Select the dashboard JSON file.
  8. Select your Hydrolix cluster as the data source.
  9. Select Import.

You will be automatically redirected to your new Zuplo dashboard.

Dashboard JSON Links

Integrate Zuplo as an API gateway for Hydrolix

The following steps generate an API gateway in Zuplo by importing an OpenAPI schema representation of the Hydrolix Config API.

Import the Hydrolix OpenAPI schema

The following OpenAPI schema is compatible with a v5.1.2 Hydrolix cluster and may be incompatible with other cluster versions. Copy the content into a file called hdx-config-api.yaml.

hdx-config-api.yaml

Replace the last line

servers:
- url: https://{myhost}.hydrolix.live

with the domain of your running Hydrolix cluster. Then save the file.

Now within the Zuplo console:

  1. Open the Code page.
  2. Select routes.oas.json in the left-hand sidebar navigation.
  3. Select the OpenAPI tab, then Import OpenAPI > Choose File.
  4. Select the hdx-config-api.yaml and confirm with Complete Merge.
  5. In the bottom left-hand corner, select Save. Wait for the confirmation in the bottom right-hand corner indicating that the changes have been deployed to the gateway.
  1. Now if you open the Route Designer tab, you should see Hydrolix endpoints.

Test some endpoints

Now that the Zuplo API gateway is live, you can send some cURL requests to it. The following are some example successful requests and corresponding responses. Replace any commands surrounded in curly braces {} with their values.

Login

curl --request POST \
     --url https://{zuplo_domain}.zuplo.dev/config/v1/login/ \
     --header 'Content-Type: application/json' \
     --header 'Accept: application/json' \
     --data-raw '{
  "username": "{username}"
  "password": "{password}",
}'
{
  "uuid": "{user-uuid}",
  "email": "{username}",
  "orgs": [
    {
      "uuid": "{org-uuid}",
      "name": "Hydrolix",
      "type": "singletenant",
      "cloud": "aws",
      "kubernetes": true
    }
  ],
  "is_superuser": false,
  "roles": [
    "super_admin"
  ],
  "audit": false,
  "emailVerified": true,
  "is_service_account": false,
  "auth_token": {
    "access_token": "{bearer-token}",
    "expires_in": 86400,
    "refresh_expires_in": 1800,
    "refresh_token": "{refresh-token}",
    "token_type": "Bearer",
    "id_token": "{id_token}",
    "not-before-policy": 0,
    "session_state": "{uuid}",
    "scope": "openid config-api-service email profile"
  }
}

Get Activities

curl --request GET \
     --url https://{zuplo_domain}.zuplo.dev/config/v1/activity/ \
     --header 'Accept: application/json' \
     --header 'Authorization: Bearer {token}}'
{
  "next": 2,
  "previous": 0,
  "current": 1,
  "num_pages": 2059,
  "count": 205808,
  "results": [
    {
      "created": "2025-04-25T16:48:00.562833Z",
      "action": "update:job",
      "org": null,
      "log": {
        "user": null,
        "action": {
          "type": "update:job",
          "description": {
            "obj": {
              "type": "job",
              "uuid": "125eac4a-e71a-4537-bdd9-e6c0474a0f8e",
              "snapshot": {
                "created": "2024-12-20T20:57:27.059280+00:00",
                "job_type": "batch_import",
                "modified": "2025-04-25T16:48:00.556517+00:00",
                "settings": {
                  "source": "76231bed-bd6a-4412-8bdc-9d7b6b7f3213",
                  "dry_run": false,
                  "max_files": 0,
                  "regex_filter": "",
                  "input_aggregation": 536870912,
                  "input_concurrency": 1,
                  "max_active_partitions": 576,
                  "max_rows_per_partition": 33554432,
                  "max_minutes_per_partition": 4000
                }
              }
            },
            "text": "Updated"
          }
        }
      }
    },
    {
      "created": "2025-04-25T15:59:00.548519Z",
      "action": "update:job",
      "org": null,
      "log": {
        "user": null,
        "action": {
          "type": "update:job",
          "description": {
            "obj": {
              "type": "job",
              "uuid": "556c27fe-6ff1-4869-b2ad-0d95b9e6fdd3",
              "snapshot": {
                "created": "2025-03-31T17:47:20.064767+00:00",
                "job_type": "alter_table",
                "modified": "2025-04-25T15:59:00.544941+00:00",
                "settings": {
                  "sql_stmt": "ALTER TABLE `my_project`.`my_table` UPDATE account_id = '666' WHERE (timestamp > '2024-12-25 00:00:00') AND (timestamp < '2025-03-31 00:00:00')",
                  "table_id": "{table-uuid}",
                  "project_id": "{project-uuid}",
                  "max_timestamp": 1743379199,
                  "min_timestamp": 1735084801,
                  "reliable_update": true
                }
              }
            },
            "text": "Updated"
          }
        }
      }
    }
  ]
}