Skip to content

Zuplo

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⚓︎

Item Description Example value How to obtain this information
Cluster hostname This is the hostname of your Hydrolix cluster. {hostname}.hydrolix.live This is the value of hydrolix_url in your hydrolixcluster.yaml without the https://.
Username The username you use to access your Hydrolix cluster. user@domain.tld This is likely your organizational email.
Password The 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 token Use 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_token See Configuring stream authentication settings for instructions on configuring table-specific stream ingest tokens.
(Non-TrafficPeak only, optional) OAuth bearer token Use 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 name This 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_table Follow 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.

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.

Zuplo console showing save confirmation

  1. Now if you open the Route Designer tab, you should see Hydrolix endpoints.

Zuplo Route Designer showing 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⚓︎

1
2
3
4
5
6
7
8
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⚓︎

1
2
3
4
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"
          }
        }
      }
    }
  ]
}