Skip to content

Working with Triggers

Triggers alert you when query results cross a threshold. They continuously monitor your data and notify you when conditions are met.

Basic Trigger Operations

List Triggers

async def list_triggers(client: HoneycombClient, dataset: str) -> list:
    """List all triggers in a dataset.

    Args:
        client: Authenticated HoneycombClient
        dataset: Dataset slug to list triggers from

    Returns:
        List of triggers
    """
    triggers = await client.triggers.list_async(dataset)
    for trigger in triggers:
        status = "enabled" if not trigger.disabled else "disabled"
        print(f"{trigger.name} ({status}): threshold {trigger.threshold.value}")
    return triggers

Get a Specific Trigger

async def get_trigger(client: HoneycombClient, dataset: str, trigger_id: str):
    """Get a trigger by ID.

    Args:
        client: Authenticated HoneycombClient
        dataset: Dataset slug containing the trigger
        trigger_id: ID of the trigger to retrieve

    Returns:
        The trigger object
    """
    trigger = await client.triggers.get_async(dataset, trigger_id)
    print(f"Name: {trigger.name}")
    print(f"Threshold: {trigger.threshold.op.value} {trigger.threshold.value}")
    print(f"Frequency: every {trigger.frequency}s")
    print(f"Status: {'enabled' if not trigger.disabled else 'disabled'}")
    return trigger

Update a Trigger

async def update_trigger(
    client: HoneycombClient, dataset: str, trigger_id: str
):
    """Update a trigger's threshold and enable it.

    Args:
        client: Authenticated HoneycombClient
        dataset: Dataset slug containing the trigger
        trigger_id: ID of the trigger to update

    Returns:
        The updated trigger
    """
    # Get existing trigger first to preserve values
    existing = await client.triggers.get_async(dataset, trigger_id)

    # Update with new values
    updated = TriggerWithInlineQuery(
        name=existing.name,
        description=existing.description,
        threshold=TriggerThreshold(
            op=existing.threshold.op,
            value=200.0,  # Change threshold value
        ),
        frequency=existing.frequency,
        disabled=False,  # Enable the trigger
        query=existing.query,
    )

    result = await client.triggers.update_async(dataset, trigger_id, updated)
    return result

Delete a Trigger

async def delete_trigger(client: HoneycombClient, dataset: str, trigger_id: str) -> None:
    """Delete a trigger.

    Args:
        client: Authenticated HoneycombClient
        dataset: Dataset slug containing the trigger
        trigger_id: ID of the trigger to delete
    """
    await client.triggers.delete_async(dataset, trigger_id)

Creating Triggers

async def create_simple_trigger(client: HoneycombClient, dataset: str) -> str:
    """Create a simple count-based trigger using TriggerBuilder.

    Args:
        client: Authenticated HoneycombClient
        dataset: Dataset slug to create trigger in

    Returns:
        The created trigger ID
    """
    bundle = (
        TriggerBuilder("High Request Count")
        .dataset(dataset)
        .description("Alert when request count exceeds threshold")
        .last_30_minutes()
        .count()
        .threshold_gt(1000)
        .every_15_minutes()
        .disabled()  # Start disabled for safety
        .build()
    )
    created = await client.triggers.create_from_bundle_async(bundle)
    return created.id

See also: trigger with filters and manual construction

Manual Construction

async def create_trigger_manual(client: HoneycombClient, dataset: str) -> str:
    """Create a trigger using manual construction.

    Args:
        client: Authenticated HoneycombClient
        dataset: Dataset slug to create trigger in

    Returns:
        The created trigger ID
    """
    trigger = TriggerWithInlineQuery(
        name="Manual Test Trigger",
        description="Created without builder",
        threshold=TriggerThreshold(
            op=TriggerThresholdOp.GREATER_THAN,
            value=100.0,
        ),
        frequency=900,
        disabled=True,
        query=QueryBuilder().last_30_minutes().count().build_for_trigger(),
    )
    created = await client.triggers.create_async(dataset, trigger)
    return created.id

TriggerBuilder Features

TriggerBuilder provides a fluent interface that combines: - Query specification (inherited from QueryBuilder) - Threshold configuration (.threshold_gt(), .threshold_lt(), etc.) - Frequency settings (.every_5_minutes(), .every_15_minutes(), etc.) - Recipients (.email(), .slack(), .pagerduty(), .webhook()) - Tags (.tag(key, value) - max 10 tags) - Baseline comparison (.baseline_1_hour_ago(), .baseline_1_day_ago(), etc.)

See the QueryBuilder documentation for full query methods.

Important Constraints

Triggers have API-enforced limits that TriggerBuilder validates at build time:

  • Time range: Maximum 3600 seconds (1 hour)
  • Frequency vs duration: time_range ≤ frequency × 4
  • Single calculation: Only one calculation per trigger (e.g., COUNT, P99, AVG)
  • No absolute time: Must use relative time ranges

Sync Usage

All trigger operations have sync equivalents:

with HoneycombClient(api_key="...", sync=True) as client:
    # List triggers
    triggers = client.triggers.list("my-dataset")

    # Create trigger
    trigger = TriggerBuilder("High Errors").dataset("my-dataset").count().threshold_gt(100).build()
    created = client.triggers.create("my-dataset", trigger)

    # Get trigger
    trigger = client.triggers.get("my-dataset", trigger_id)

    # Update trigger
    updated = client.triggers.update("my-dataset", trigger_id, TriggerCreate(...))

    # Delete trigger
    client.triggers.delete("my-dataset", trigger_id)