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.
- Exporting Zuplo logs to Hydrolix (Akamai TrafficPeak) using the Hydrolix / Akamai TrafficPeak Plugin from Zuplo.
- 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. | [email protected] | 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.
- Save one of the JSON object files from the links below.
- Login to your Grafana instance.
- Open Dashboards in the left-hand nav.
- Select New > New Dashboard.
- Select Import Dashboard.
- Select Upload dashboard JSON file.
- Select the dashboard JSON file.
- Select your Hydrolix cluster as the data source.
- Select Import.
You will be automatically redirected to your new Zuplo dashboard.
Dashboard JSON Links
- Zuplo Geo Distribution
- Zuplo High Level
- Zuplo Main Dashboard
- Zuplo Request Summaries
- Zuplo Standard Metrics
- Zuplo Status Codes and Error Rates
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
.
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:
- Open the Code page.
- Select
routes.oas.json
in the left-hand sidebar navigation. - Select the OpenAPI tab, then Import OpenAPI > Choose File.
- Select the
hdx-config-api.yaml
and confirm with Complete Merge. - 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.

- 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"
}
}
}
}
]
}
Updated 23 days ago