Healthchecks
Healthchecks in Ductape monitor the availability and performance of your app integrations by automatically executing actions at regular intervals. This helps you detect downtime, track response times, and ensure your critical integrations are always operational.
What Are Healthchecks?
A healthcheck is a scheduled monitoring task that:
- Executes a specific app action at defined intervals
- Tracks success/failure status across multiple environments
- Measures response latency and availability
- Automatically retries failed checks before marking as unhealthy
- Maintains historical performance data per environment
Healthchecks are perfect for monitoring third-party APIs, internal services, or any app action that needs continuous availability tracking.
Creating a Healthcheck
To create a healthcheck, use ductape.health.create():
- TypeScript
- Java
- Go
- .NET
import Ductape from '@ductape/sdk';
const ductape = new Ductape({
accessKey: 'your-access-key',
});
await ductape.health.create({
name: 'API Health Monitor',
description: 'Monitors main API endpoint availability',
tag: 'api-health-check',
app: 'my-app', // App access tag
event: 'ping-endpoint', // Action tag to execute
interval: 60000, // Check every 60 seconds
retries: 3, // Retry 3 times before marking as failed
envs: [
{
slug: 'prd',
input: {
query: { url: 'https://api.example.com/ping' },
},
},
{
slug: 'dev',
input: {
query: { url: 'https://dev.api.example.com/ping' },
},
},
],
});
import app.ductape.sdk.Ductape;
import app.ductape.sdk.core.EnvType;
import app.ductape.sdk.core.RequestContext;
RequestContext auth = new RequestContext(null, null, null, null, 'your-access-key');
Ductape ductape = new Ductape(EnvType.PRODUCTION, auth);
ductape.health.create(Map.of(
"name", "API Health Monitor",
"description", "Monitors main API endpoint availability",
"tag", "api-health-check",
"app", "my-app", // App access tag
"event", "ping-endpoint", // Action tag to execute
"interval", 60000, // Check every 60 seconds
"retries", 3, // Retry 3 times before marking as failed
envs: [
Map.of(
"slug", "prd",
input: Map.of(
query: Map.of( "url", "https://api.example.com/ping" ),
),
),
Map.of(
"slug", "dev",
input: Map.of(
query: Map.of( "url", "https://dev.api.example.com/ping" ),
),
),
],
));
import (
"context"
"github.com/ductape/ductape/sdk/go/core"
"github.com/ductape/ductape/sdk/go/ductape"
)
auth := core.NewRequestContext("", "", "", "", 'your-access-key')
client, err := client.New(core.EnvProduction, auth)
if err != nil {
return err
}
client.health.create({
"name": "API Health Monitor",
"description": "Monitors main API endpoint availability",
"tag": "api-health-check",
"app": "my-app", // App access tag
"event": "ping-endpoint", // Action tag to execute
"interval": 60000, // Check every 60 seconds
"retries": 3, // Retry 3 times before marking as failed
envs: [
{
"slug": "prd",
input: {
query: { "url": "https://api.example.com/ping" },
},
},
{
"slug": "dev",
input: {
query: { "url": "https://dev.api.example.com/ping" },
},
},
],
});
using Ductape.Sdk;
using Ductape.Sdk.Core;
var auth = new RequestContext(null, null, null, null, 'your-access-key', null);
var ductape = new Ductape(EnvType.Production, auth);
await ductape.health.create({
["name"] = "API Health Monitor",
["description"] = "Monitors main API endpoint availability",
["tag"] = "api-health-check",
["app"] = "my-app", // App access tag
["event"] = "ping-endpoint", // Action tag to execute
["interval"] = 60000, // Check every 60 seconds
["retries"] = 3, // Retry 3 times before marking as failed
envs: [
{
["slug"] = "prd",
input: {
query: { ["url"] = "https://api.example.com/ping" },
},
},
{
["slug"] = "dev",
input: {
query: { ["url"] = "https://dev.api.example.com/ping" },
},
},
],
});
Healthcheck Fields
| Field | Type | Description |
|---|---|---|
name | string | Display name for the healthcheck |
description | string | Description of what's being monitored |
tag | string | Unique identifier for this healthcheck |
app | string | The access tag of the app containing the action |
event | string | The tag of the app action to execute |
interval | number | Time between checks in milliseconds |
retries | number | Number of retry attempts on failure |
envs | CheckEnvStatus[] | Environment-specific configurations |
Environment Configuration (CheckEnvStatus)
Each environment in the envs array can have:
| Field | Type | Description |
|---|---|---|
slug | string | Environment slug (e.g., 'prd', 'dev', 'stg') |
input | any | Input parameters for the action execution |
status | string | Current health status (set automatically) |
lastAvailable | string | Timestamp of last successful check (set automatically) |
lastChecked | string | Timestamp of most recent check (set automatically) |
lastLatency | string | Response time of last check in ms (set automatically) |
averageLatency | string | Average response time (set automatically) |
Note: Status and performance fields are automatically populated by Ductape as healthchecks run.
How Healthchecks Work
- Scheduling: Ductape executes the specified action at the defined interval
- Execution: The action runs with the environment-specific input parameters
- Retry Logic: If the action fails, it retries up to the specified retry count
- Status Update: Success/failure and performance metrics are recorded
- Environment Tracking: Each environment maintains its own status and metrics
Fetching Healthchecks
Get All Healthchecks for an App
- TypeScript
- Java
- Go
- .NET
const healthchecks = await ductape.health.fetchAll('my-app');
healthchecks.forEach(check => {
console.log(`${check.name}: ${check.tag}`);
console.log(`Interval: ${check.interval}ms`);
check.envs.forEach(env => {
console.log(` ${env.slug}: ${env.status} (${env.lastLatency}ms)`);
});
});
Map<String, Object> healthchecks = ductape.health.fetchAll('my-app');
healthchecks.forEach(check => Map.of(
System.out.println(`$Map.of(check.name): $Map.of(check.tag)`);
System.out.println(`Interval: $Map.of(check.interval)ms`);
check.envs.forEach(env => Map.of(
System.out.println(` $Map.of(env.slug): $Map.of(env.status) ($Map.of(env.lastLatency)ms)`);
));
));
healthchecks := client.health.fetchAll('my-app');
healthchecks.forEach(check => {
fmt.Println(`${check.name}: ${check.tag}`);
fmt.Println(`Interval: ${check.interval}ms`);
check.envs.forEach(env => {
fmt.Println(` ${env.slug}: ${env.status} (${env.lastLatency}ms)`);
});
});
var healthchecks = await ductape.health.fetchAll('my-app');
healthchecks.forEach(check => {
Console.WriteLine(`${check.name}: ${check.tag}`);
Console.WriteLine(`Interval: ${check.interval}ms`);
check.envs.forEach(env => {
Console.WriteLine(` ${env.slug}: ${env.status} (${env.lastLatency}ms)`);
});
});
Get a Specific Healthcheck
- TypeScript
- Java
- Go
- .NET
const healthcheck = await ductape.health.fetch('my-app', 'api-health-check');
console.log('Healthcheck:', healthcheck.name);
console.log('App:', healthcheck.app);
console.log('Action:', healthcheck.event);
console.log('Interval:', healthcheck.interval);
console.log('Environments:');
healthcheck.envs.forEach(env => {
console.log(` ${env.slug}:`);
console.log(` Status: ${env.status}`);
console.log(` Last Checked: ${env.lastChecked}`);
console.log(` Latency: ${env.lastLatency}ms`);
console.log(` Average Latency: ${env.averageLatency}ms`);
});
Map<String, Object> healthcheck = ductape.health.fetch('my-app', 'api-health-check');
System.out.println('"Healthcheck", ", healthcheck.name);
System.out.println(""App", ", healthcheck.app);
System.out.println(""Action", ", healthcheck.event);
System.out.println(""Interval", ", healthcheck.interval);
System.out.println("Environments:');
healthcheck.envs.forEach(env => Map.of(
System.out.println(` $Map.of(env.slug):`);
System.out.println(` Status: $Map.of(env.status)`);
System.out.println(` Last Checked: $Map.of(env.lastChecked)`);
System.out.println(` Latency: $Map.of(env.lastLatency)ms`);
System.out.println(` Average Latency: $Map.of(env.averageLatency)ms`);
));
healthcheck := client.health.fetch('my-app', 'api-health-check');
fmt.Println('"Healthcheck": ", healthcheck.name);
fmt.Println(""App": ", healthcheck.app);
fmt.Println(""Action": ", healthcheck.event);
fmt.Println(""Interval": ", healthcheck.interval);
fmt.Println("Environments:');
healthcheck.envs.forEach(env => {
fmt.Println(` ${env.slug}:`);
fmt.Println(` Status: ${env.status}`);
fmt.Println(` Last Checked: ${env.lastChecked}`);
fmt.Println(` Latency: ${env.lastLatency}ms`);
fmt.Println(` Average Latency: ${env.averageLatency}ms`);
});
var healthcheck = await ductape.health.fetch('my-app', 'api-health-check');
Console.WriteLine('["Healthcheck"] = ", healthcheck.name);
Console.WriteLine("["App"] = ", healthcheck.app);
Console.WriteLine("["Action"] = ", healthcheck.event);
Console.WriteLine("["Interval"] = ", healthcheck.interval);
Console.WriteLine("Environments:');
healthcheck.envs.forEach(env => {
Console.WriteLine(` ${env.slug}:`);
Console.WriteLine(` Status: ${env.status}`);
Console.WriteLine(` Last Checked: ${env.lastChecked}`);
Console.WriteLine(` Latency: ${env.lastLatency}ms`);
Console.WriteLine(` Average Latency: ${env.averageLatency}ms`);
});
Updating Healthchecks
Update healthcheck configuration using ductape.health.update():
- TypeScript
- Java
- Go
- .NET
await ductape.health.update('api-health-check', {
interval: 120000, // Change to every 2 minutes
retries: 5, // Increase retries
envs: [
{
slug: 'prd',
input: {
query: { url: 'https://api.example.com/v2/ping' },
},
},
],
});
ductape.health.update('api-health-check', Map.of(
"interval", 120000, // Change to every 2 minutes
"retries", 5, // Increase retries
envs: [
Map.of(
"slug", "prd",
input: Map.of(
query: Map.of( "url", "https://api.example.com/v2/ping" ),
),
),
],
));
client.health.update('api-health-check', {
"interval": 120000, // Change to every 2 minutes
"retries": 5, // Increase retries
envs: [
{
"slug": "prd",
input: {
query: { "url": "https://api.example.com/v2/ping" },
},
},
],
});
await ductape.health.update('api-health-check', {
["interval"] = 120000, // Change to every 2 minutes
["retries"] = 5, // Increase retries
envs: [
{
["slug"] = "prd",
input: {
query: { ["url"] = "https://api.example.com/v2/ping" },
},
},
],
});
Use Cases
- API Monitoring: Continuously verify third-party API availability
- Service Health: Track internal microservice responsiveness
- Endpoint Validation: Ensure critical endpoints return expected responses
- Performance Tracking: Monitor response times and detect degradation
- Alerting: Use healthcheck status to trigger notifications or fallback actions
Example: Comprehensive Healthcheck Setup
- TypeScript
- Java
- Go
- .NET
import Ductape from '@ductape/sdk';
const ductape = new Ductape({
accessKey: 'your-access-key',
});
await ductape.product.init('payment-system');
// Create healthcheck for payment gateway
await ductape.health.create({
name: 'Stripe Gateway Health',
description: 'Monitors Stripe API availability',
tag: 'stripe-health',
app: 'stripe-integration',
event: 'check-connection',
interval: 30000, // Every 30 seconds
retries: 2,
envs: [
{
slug: 'prd',
input: {
headers: { 'X-Health-Check': 'true' },
},
},
{
slug: 'stg',
input: {
headers: { 'X-Health-Check': 'true' },
},
},
],
});
// Fetch and display status
const health = await ductape.health.fetch('stripe-integration', 'stripe-health');
console.log(`Stripe Health: ${health.envs.find(e => e.slug === 'prd')?.status}`);
import app.ductape.sdk.Ductape;
import app.ductape.sdk.core.EnvType;
import app.ductape.sdk.core.RequestContext;
RequestContext auth = new RequestContext(null, null, null, null, 'your-access-key');
Ductape ductape = new Ductape(EnvType.PRODUCTION, auth);
ductape.product.init('payment-system');
// Create healthcheck for payment gateway
ductape.health.create(Map.of(
"name", "Stripe Gateway Health",
"description", "Monitors Stripe API availability",
"tag", "stripe-health",
"app", "stripe-integration",
"event", "check-connection",
"interval", 30000, // Every 30 seconds
"retries", 2,
envs: [
Map.of(
"slug", "prd",
input: Map.of(
headers: Map.of( 'X-Health-Check': 'true' ),
),
),
Map.of(
"slug", "stg",
input: Map.of(
headers: Map.of( 'X-Health-Check': 'true' ),
),
),
],
));
// Fetch and display status
Map<String, Object> health = ductape.health.fetch('stripe-integration', 'stripe-health');
System.out.println(`Stripe Health: $Map.of(health.envs.find(e => e.slug === 'prd')?.status)`);
import (
"context"
"github.com/ductape/ductape/sdk/go/core"
"github.com/ductape/ductape/sdk/go/ductape"
)
auth := core.NewRequestContext("", "", "", "", 'your-access-key')
client, err := client.New(core.EnvProduction, auth)
if err != nil {
return err
}
client.product.init('payment-system');
// Create healthcheck for payment gateway
client.health.create({
"name": "Stripe Gateway Health",
"description": "Monitors Stripe API availability",
"tag": "stripe-health",
"app": "stripe-integration",
"event": "check-connection",
"interval": 30000, // Every 30 seconds
"retries": 2,
envs: [
{
"slug": "prd",
input: {
headers: { 'X-Health-Check': 'true' },
},
},
{
"slug": "stg",
input: {
headers: { 'X-Health-Check': 'true' },
},
},
],
});
// Fetch and display status
health := client.health.fetch('stripe-integration', 'stripe-health');
fmt.Println(`Stripe Health: ${health.envs.find(e => e.slug === 'prd')?.status}`);
using Ductape.Sdk;
using Ductape.Sdk.Core;
var auth = new RequestContext(null, null, null, null, 'your-access-key', null);
var ductape = new Ductape(EnvType.Production, auth);
await ductape.product.init('payment-system');
// Create healthcheck for payment gateway
await ductape.health.create({
["name"] = "Stripe Gateway Health",
["description"] = "Monitors Stripe API availability",
["tag"] = "stripe-health",
["app"] = "stripe-integration",
["event"] = "check-connection",
["interval"] = 30000, // Every 30 seconds
["retries"] = 2,
envs: [
{
["slug"] = "prd",
input: {
headers: { 'X-Health-Check': 'true' },
},
},
{
["slug"] = "stg",
input: {
headers: { 'X-Health-Check': 'true' },
},
},
],
});
// Fetch and display status
var health = await ductape.health.fetch('stripe-integration', 'stripe-health');
Console.WriteLine(`Stripe Health: ${health.envs.find(e => e.slug === 'prd')?.status}`);
Best Practices
- Set appropriate intervals—too frequent may overwhelm services, too infrequent may miss issues
- Use retries to handle transient failures without false alarms
- Monitor production and staging environments separately
- Keep healthcheck actions lightweight and fast
- Use healthcheck status to trigger automated alerts or fallback systems
- Review average latency trends to detect performance degradation
See Also
- App Actions - Learn about creating actions to monitor
- Fallbacks - Automatically switch providers on healthcheck failures
- Jobs - Schedule recurring tasks