| name | hamilton-observability |
| description | Hamilton UI and SDK patterns for tracking, monitoring, and debugging dataflows. Use for observability, lineage tracking, and production monitoring. |
| allowed-tools | Read, Grep, Glob, Bash(python:*), Bash(hamilton:*) |
| user-invocable | true |
| disable-model-invocation | false |
Hamilton Observability & UI
This skill covers the Hamilton UI, SDK, and observability patterns for tracking and monitoring your dataflows in development and production.
What is Hamilton UI?
Hamilton UI is a web-based dashboard for:
- Tracking DAG executions - See every run with inputs, outputs, and timing
- Visualizing dataflows - Interactive DAG visualization
- Debugging failures - Inspect errors and intermediate values
- Lineage tracking - Understand data provenance
- Performance monitoring - Identify bottlenecks
- Team collaboration - Share DAGs and results
Quick Start
1. Install Hamilton with UI Support
pip install "apache-hamilton[sdk,ui]"
2. Start the Hamilton UI
hamilton ui
3. Add Tracking to Your Code
"""Add HamiltonTracker to your driver."""
from hamilton_sdk import adapters
from hamilton import driver
tracker = adapters.HamiltonTracker(
project_id=1,
username="your.email@example.com",
dag_name="my_pipeline",
tags={"environment": "dev", "team": "data-science"}
)
dr = driver.Builder()\
.with_config(your_config)\
.with_modules(*your_modules)\
.with_adapters(tracker)\
.build()
results = dr.execute(['final_output'], inputs={'data_path': 'data.csv'})
4. View in UI
Open http://localhost:8241 and see:
- Your DAG visualization
- Execution history
- Node-level timing
- Input/output values
HamiltonTracker Features
Basic Tracking
"""Minimal tracking setup."""
from hamilton_sdk import adapters
tracker = adapters.HamiltonTracker(
project_id=1,
username="user@example.com",
dag_name="etl_pipeline"
)
dr = driver.Builder().with_adapters(tracker).build()
Advanced Tracking with Tags
"""Use tags for filtering and organization."""
tracker = adapters.HamiltonTracker(
project_id=1,
username="user@example.com",
dag_name="ml_training",
tags={
"environment": "production",
"model_version": "v2.1",
"team": "ml-platform",
"experiment_id": "exp_123"
}
)
Async Tracking
"""Track async workflows."""
from hamilton import async_driver
from hamilton_sdk import adapters
tracker = adapters.AsyncHamiltonTracker(
project_id=1,
username="user@example.com",
dag_name="async_rag_pipeline"
)
dr = await async_driver.Builder()\
.with_modules(async_module)\
.with_adapters(tracker)\
.build()
result = await dr.execute(['llm_response'], inputs={'query': 'test'})
Project Organization
Creating Projects
Projects group related DAGs together:
import requests
response = requests.post(
"http://localhost:8241/api/v1/projects",
json={"name": "Customer Analytics", "description": "Customer data pipelines"}
)
project_id = response.json()['id']
Organizing by Team
"""Organize DAGs by team and environment."""
tracker_team_a_dev = adapters.HamiltonTracker(
project_id=1,
username="user@example.com",
dag_name="user_segmentation",
tags={"team": "team-a", "env": "dev"}
)
tracker_team_a_prod = adapters.HamiltonTracker(
project_id=1,
username="user@example.com",
dag_name="user_segmentation",
tags={"team": "team-a", "env": "prod"}
)
tracker_team_b = adapters.HamiltonTracker(
project_id=2,
username="user@example.com",
dag_name="recommendation_model",
tags={"team": "team-b", "env": "dev"}
)
Debugging with Hamilton UI
Inspecting Failed Runs
When a DAG fails, the UI shows:
- Which node failed - Visual highlighting
- Error message - Full stack trace
- Inputs to failed node - Inspect what caused the failure
- Successful nodes - What completed before failure
- Timing - Where time was spent before failure
"""DAG fails at 'processed_data' node."""
Comparing Runs
Compare two DAG runs side-by-side:
- Input differences
- Timing changes
- Output value changes
- Code changes
"""Compare dev vs prod performance."""
Node-Level Inspection
Drill into any node to see:
- Execution time
- Input values
- Output values (if stored)
- Error details (if failed)
- Code version
Lineage Tracking
Understanding Data Provenance
Hamilton UI automatically tracks:
- Upstream dependencies - What data contributed to this result?
- Downstream impact - What depends on this node?
- Cross-DAG lineage - Track data between different pipelines
"""Track lineage across training and inference."""
training_tracker = adapters.HamiltonTracker(
project_id=1,
username="user@example.com",
dag_name="model_training",
tags={"stage": "training", "model_version": "v2.1"}
)
inference_tracker = adapters.HamiltonTracker(
project_id=1,
username="user@example.com",
dag_name="model_inference",
tags={"stage": "inference", "model_version": "v2.1"}
)
Production Monitoring
Key Metrics to Track
"""Track production metrics."""
tracker = adapters.HamiltonTracker(
project_id=1,
username="service@example.com",
dag_name="production_etl",
tags={
"environment": "production",
"service": "data-pipeline",
"version": os.getenv("SERVICE_VERSION", "unknown"),
"host": os.getenv("HOSTNAME", "unknown")
}
)
Alerting on Failures
"""Set up failure notifications."""
Performance Monitoring
Track performance over time:
"""Monitor performance degradation."""
Integration with Other Tools
MLflow Integration
"""Track both Hamilton and MLflow."""
from hamilton_sdk import adapters
import mlflow
hamilton_tracker = adapters.HamiltonTracker(
project_id=1,
username="user@example.com",
dag_name="ml_training"
)
dr = driver.Builder()\
.with_adapters(hamilton_tracker, mlflow_tracker)\
.build()
Airflow Integration
"""Track Hamilton DAGs in Airflow tasks."""
from airflow import DAG
from airflow.operators.python import PythonOperator
from hamilton_sdk import adapters
def run_hamilton_pipeline(**context):
"""Execute Hamilton with tracking."""
tracker = adapters.HamiltonTracker(
project_id=1,
username="airflow@example.com",
dag_name="airflow_etl",
tags={
"airflow_dag": context['dag'].dag_id,
"airflow_run": context['run_id'],
"task": context['task_instance'].task_id
}
)
dr = driver.Builder()\
.with_modules(my_module)\
.with_adapters(tracker)\
.build()
return dr.execute(['output'], inputs=context['params'])
with DAG('my_dag', schedule_interval='@daily') as dag:
task = PythonOperator(
task_id='hamilton_pipeline',
python_callable=run_hamilton_pipeline
)
SDK Advanced Usage
Querying Runs Programmatically
"""Query Hamilton UI via SDK."""
from hamilton_sdk import client
hc = client.HamiltonClient(
base_url="http://localhost:8241",
username="user@example.com"
)
runs = hc.get_runs(
project_id=1,
dag_name="my_pipeline",
limit=10
)
for run in runs:
print(f"Run {run.id}: {run.status} in {run.duration}s")
run_detail = hc.get_run(run_id=runs[0].id)
print(f"Inputs: {run_detail.inputs}")
print(f"Outputs: {run_detail.outputs}")
Custom Metadata
"""Add custom metadata to runs."""
tracker = adapters.HamiltonTracker(
project_id=1,
username="user@example.com",
dag_name="my_pipeline",
tags={
"git_commit": subprocess.check_output(['git', 'rev-parse', 'HEAD']).decode().strip(),
"git_branch": subprocess.check_output(['git', 'rev-parse', '--abbrev-ref', 'HEAD']).decode().strip(),
"dataset_version": "v2024.01",
"experiment_name": "baseline_v2"
}
)
Best Practices
- Use descriptive dag_names - Make them searchable (e.g., "user_segmentation_daily" not "pipeline_1")
- Tag consistently - Use standard keys (environment, team, version)
- Track production - Always enable tracking in production
- Monitor trends - Set up dashboards for key metrics
- Clean up old runs - Archive or delete runs after retention period
- Use projects - Organize by team/domain, not by environment
- Document tags - Create team standard for tag keys and values
Troubleshooting
UI Not Showing Runs
curl http://localhost:8241/api/v1/ping
tracker = adapters.HamiltonTracker(
project_id=1,
username="user@example.com",
dag_name="my_pipeline",
api_url="http://localhost:8241"
)
Slow UI Performance
"""Optimize tracking for large DAGs."""
tracker = adapters.HamiltonTracker(
project_id=1,
username="user@example.com",
dag_name="large_pipeline",
capture_data_statistics=False,
)
Additional Resources
- For core Hamilton patterns, use
/hamilton-core
- For scaling patterns, use
/hamilton-scale
- Hamilton UI docs: hamilton.apache.org/concepts/ui
- Hamilton SDK docs: github.com/apache/hamilton/tree/main/ui/sdk