Skip to content

Datadog Integration for OpenIndiana

Datadog Integration for OpenIndiana/illumos

Section titled “Datadog Integration for OpenIndiana/illumos”

Comprehensive guide to implementing Datadog monitoring on OpenIndiana, including four different approaches ranging from quick compatibility testing to native DTrace integration.

Datadog does not officially support OpenIndiana/illumos, but several integration paths exist:

ApproachComplexityCompatibilityPerformanceDTrace Integration
RapDev Solaris AgentLowMediumGoodNo
StatsD BridgeLowHighExcellentYes
Unix Agent PortMediumHighGoodPartial
Native DTrace AgentHighPerfectExcellentFull

Option 1: RapDev Solaris Agent (Quick Start)

Section titled “Option 1: RapDev Solaris Agent (Quick Start)”
┌─────────────────┐
│ OpenIndiana │
│ │
│ ┌───────────┐ │
│ │ RapDev │─┼─────▶ Datadog API
│ │ Perl │ │ (HTTP/HTTPS)
│ │ Agent │ │
│ └─────┬─────┘ │
│ │ │
│ ┌───▼────┐ │
│ │ kstat │ │
│ │ prstat │ │
│ └────────┘ │
└─────────────────┘

Best For: Rapid evaluation, Perl-friendly environments

Section titled “Option 2: StatsD + DTrace Bridge (Recommended)”
┌──────────────────────────────────┐
│ OpenIndiana │
│ │
│ ┌─────────┐ ┌──────────┐ │
│ │ DTrace │─────▶│ StatsD │──┼───▶ Datadog Agent
│ │ Probes │ │ Bridge │ │ (on Linux host)
│ └─────────┘ └──────────┘ │
│ │
│ Custom metrics, latency, │
│ I/O, network, application │
└──────────────────────────────────┘

Best For: Production deployments, custom metrics, low overhead

┌──────────────────────────────────┐
│ OpenIndiana │
│ │
│ ┌────────────────────────────┐ │
│ │ datadog-unix-agent │ │
│ │ (Go, ported to illumos) │─┼───▶ Datadog API
│ │ │ │
│ │ - System metrics │ │
│ │ - Process monitoring │ │
│ │ - Custom checks │ │
│ └────────────────────────────┘ │
└──────────────────────────────────┘

Best For: Standard Datadog workflow, Go developers

┌──────────────────────────────────────┐
│ OpenIndiana │
│ │
│ ┌────────────────────────────────┐ │
│ │ vibecode-datadog-illumos │ │
│ │ │─┼───▶ Datadog API
│ │ ┌──────────┐ ┌──────────┐ │ │
│ │ │ DTrace │ │ kstat │ │ │
│ │ │ Engine │ │ Reader │ │ │
│ │ └──────────┘ └──────────┘ │ │
│ │ │ │
│ │ Built-in SMF, zones support │ │
│ └────────────────────────────────┘ │
└──────────────────────────────────────┘

Best For: Enterprise illumos deployments, maximum performance

Terminal window
# 1. Install Perl and dependencies (if not present)
sudo pkg install perl-532 pkg:/library/perl-5/xml-parser
# 2. Download RapDev Solaris Agent
# Contact RapDev: https://www.rapdev.io/products/datadog-solaris-agent
# 3. Extract agent
gunzip rapdev-datadog-solaris-agent.tar.gz
tar xf rapdev-datadog-solaris-agent.tar
# 4. Configure
cd rapdev-datadog-solaris-agent
cp datadog.conf.example datadog.conf
# 5. Edit configuration
cat > datadog.conf <<EOF
[Main]
dd_url = https://api.datadoghq.com
api_key = YOUR_DATADOG_API_KEY
hostname = vibecode-openindiana-01
[Logging]
log_level = info
log_file = /var/log/datadog-agent.log
EOF
# 6. Test agent
./agent.pl check
# 7. Create SMF manifest
cat > /var/svc/manifest/site/datadog-agent.xml <<'MANIFEST'
<?xml version="1.0"?>
<!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">
<service_bundle type='manifest' name='datadog-agent'>
<service name='site/datadog-agent' type='service' version='1'>
<create_default_instance enabled='true' />
<single_instance />
<dependency name='network' grouping='require_all' restart_on='error' type='service'>
<service_fmri value='svc:/milestone/network:default' />
</dependency>
<exec_method type='method' name='start'
exec='/opt/rapdev-datadog/agent.pl start'
timeout_seconds='60' />
<exec_method type='method' name='stop'
exec='/opt/rapdev-datadog/agent.pl stop'
timeout_seconds='60' />
<property_group name='startd' type='framework'>
<propval name='duration' type='astring' value='child' />
</property_group>
<stability value='Evolving' />
</service>
</service_bundle>
MANIFEST
# 8. Import and enable
sudo svccfg import /var/svc/manifest/site/datadog-agent.xml
sudo svcadm enable datadog-agent
  • CPU: Per-core utilization, load average, context switches
  • Memory: Physical, virtual, swap usage
  • Disk: I/O operations, throughput, latency
  • Network: Bytes in/out, packets, errors
  • Processes: Count, states, resource usage
  • No DTrace integration
  • Limited to standard Solaris metrics (kstat, prstat)
  • May require modification for illumos-specific features
  • Perl dependency
Terminal window
# Check Perl version
perl -v # Should be 5.32+
# Test kstat access
kstat -m cpu_info
# Test prstat
prstat 1 1
# Verify network connectivity to Datadog
curl -v https://api.datadoghq.com/api/v1/validate
# Check agent logs
tail -f /var/log/datadog-agent.log
Section titled “Option 2: StatsD + DTrace Bridge (Recommended)”

This approach uses DTrace to collect metrics and forwards them to a StatsD server, which then sends to Datadog.

Terminal window
# Option A: Run StatsD in lx zone
sudo zlogin vibecode-zone
apt update
apt install -y nodejs npm
npm install -g statsd
# Configure StatsD
cat > /etc/statsd/config.js <<'EOF'
{
port: 8125,
backends: ["./backends/datadog"],
datadogApiKey: "YOUR_DATADOG_API_KEY",
datadogHostname: "vibecode-openindiana-01",
// Flush interval (10 seconds)
flushInterval: 10000,
// Datadog-specific settings
datadogTags: ["env:production", "platform:openindiana", "app:vibecode"]
}
EOF
# Start StatsD
statsd /etc/statsd/config.js &
# Option B: Use Datadog Agent on separate Linux host
# Install Datadog Agent on Linux machine
# Configure it to receive StatsD metrics
# Point DTrace bridge to this host
Terminal window
# Install Python in global zone or lx zone
sudo pkg install python-39
# Create bridge script
cat > /opt/dtrace-statsd-bridge.py <<'EOF'
#!/usr/bin/env python3
"""
DTrace to StatsD Bridge for OpenIndiana
Collects system metrics via DTrace and sends to StatsD
"""
import socket
import subprocess
import time
import re
from typing import Dict, List
class DTraceStatsDBridge:
def __init__(self, statsd_host='localhost', statsd_port=8125):
self.statsd_host = statsd_host
self.statsd_port = statsd_port
self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
def send_metric(self, metric_name: str, value: float, metric_type: str = 'g'):
"""
Send metric to StatsD
metric_type: g=gauge, c=counter, ms=timer, h=histogram, s=set
"""
message = f"{metric_name}:{value}|{metric_type}"
self.sock.sendto(message.encode(), (self.statsd_host, self.statsd_port))
def collect_cpu_metrics(self):
"""Collect CPU utilization via DTrace"""
script = '''
#pragma D option quiet
profile:::profile-1001
{
@idle["idle"] = sum(curthread->t_cpu->cpu_intr_actv == 0 ? 1 : 0);
@user["user"] = sum(curthread->t_cpu->cpu_stats.sys.cpu_ticks_user);
@kernel["kernel"] = sum(curthread->t_cpu->cpu_stats.sys.cpu_ticks_kernel);
}
tick-10s
{
printa("idle %@u\\n", @idle);
printa("user %@u\\n", @user);
printa("kernel %@u\\n", @kernel);
exit(0);
}
'''
result = subprocess.run(['dtrace', '-n', script],
capture_output=True, text=True, timeout=15)
for line in result.stdout.strip().split('\n'):
if line:
parts = line.split()
if len(parts) == 2:
metric, value = parts
self.send_metric(f'system.cpu.{metric}', float(value))
def collect_io_latency(self):
"""Collect I/O latency via DTrace"""
script = '''
#pragma D option quiet
io:::start
{
self->start = timestamp;
}
io:::done
/self->start/
{
@latency = quantize(timestamp - self->start);
self->start = 0;
}
tick-10s
{
printa(@latency);
exit(0);
}
'''
result = subprocess.run(['dtrace', '-n', script],
capture_output=True, text=True, timeout=15)
# Parse quantize output and send percentiles
# (Simplified - full implementation would parse distribution)
self.send_metric('system.io.latency', 0, 'ms')
def collect_network_metrics(self):
"""Collect network metrics via kstat"""
result = subprocess.run(['kstat', '-p', 'link:*:*:rbytes64'],
capture_output=True, text=True)
for line in result.stdout.strip().split('\n'):
if 'rbytes64' in line:
parts = line.split()
if len(parts) == 2:
self.send_metric('system.net.bytes_rcvd', float(parts[1]), 'c')
result = subprocess.run(['kstat', '-p', 'link:*:*:obytes64'],
capture_output=True, text=True)
for line in result.stdout.strip().split('\n'):
if 'obytes64' in line:
parts = line.split()
if len(parts) == 2:
self.send_metric('system.net.bytes_sent', float(parts[1]), 'c')
def collect_zfs_metrics(self):
"""Collect ZFS ARC metrics via kstat"""
result = subprocess.run(['kstat', '-p', 'zfs:0:arcstats:size'],
capture_output=True, text=True)
for line in result.stdout.strip().split('\n'):
parts = line.split()
if len(parts) == 2:
self.send_metric('zfs.arc.size', float(parts[1]))
# Hit ratio
result = subprocess.run(['kstat', '-p', 'zfs:0:arcstats:hits'],
capture_output=True, text=True)
hits = int(result.stdout.strip().split()[1]) if result.stdout else 0
result = subprocess.run(['kstat', '-p', 'zfs:0:arcstats:misses'],
capture_output=True, text=True)
misses = int(result.stdout.strip().split()[1]) if result.stdout else 0
if hits + misses > 0:
hit_ratio = (hits / (hits + misses)) * 100
self.send_metric('zfs.arc.hit_ratio', hit_ratio)
def collect_zone_metrics(self):
"""Collect zone-specific metrics"""
result = subprocess.run(['prstat', '-Z', '1', '1'],
capture_output=True, text=True)
# Parse prstat output (simplified)
for line in result.stdout.split('\n'):
if 'vibecode-zone' in line:
# Extract CPU, memory usage
# Send as tagged metrics
pass
def run(self, interval=10):
"""Main collection loop"""
print(f"Starting DTrace-StatsD bridge (interval: {interval}s)")
while True:
try:
print("Collecting metrics...")
self.collect_cpu_metrics()
self.collect_network_metrics()
self.collect_zfs_metrics()
# self.collect_io_latency() # Enable if needed
# self.collect_zone_metrics()
print(f"Metrics sent. Sleeping {interval}s...")
time.sleep(interval)
except KeyboardInterrupt:
print("\nShutting down...")
break
except Exception as e:
print(f"Error: {e}")
time.sleep(interval)
if __name__ == '__main__':
import sys
statsd_host = sys.argv[1] if len(sys.argv) > 1 else 'localhost'
statsd_port = int(sys.argv[2]) if len(sys.argv) > 2 else 8125
bridge = DTraceStatsDBridge(statsd_host, statsd_port)
bridge.run()
EOF
chmod +x /opt/dtrace-statsd-bridge.py
# Test the bridge
sudo /opt/dtrace-statsd-bridge.py localhost 8125
Terminal window
cat > /var/svc/manifest/site/dtrace-statsd.xml <<'EOF'
<?xml version="1.0"?>
<!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">
<service_bundle type='manifest' name='dtrace-statsd-bridge'>
<service name='site/dtrace-statsd' type='service' version='1'>
<create_default_instance enabled='true' />
<single_instance />
<dependency name='network' grouping='require_all' restart_on='error' type='service'>
<service_fmri value='svc:/milestone/network:default' />
</dependency>
<exec_method type='method' name='start'
exec='/opt/dtrace-statsd-bridge.py localhost 8125 &amp;'
timeout_seconds='60'>
<method_context>
<method_credential user='root' group='root' privileges='all' />
</method_context>
</exec_method>
<exec_method type='method' name='stop'
exec=':kill'
timeout_seconds='60' />
<property_group name='startd' type='framework'>
<propval name='duration' type='astring' value='child' />
</property_group>
<stability value='Evolving' />
</service>
</service_bundle>
EOF
sudo svccfg import /var/svc/manifest/site/dtrace-statsd.xml
sudo svcadm enable dtrace-statsd
# DTrace script to monitor Node.js performance
cat > /opt/dtrace/nodejs-monitoring.d <<'EOF'
#!/usr/sbin/dtrace -s
#pragma D option quiet
dtrace:::BEGIN
{
printf("Monitoring Node.js application...\n");
start = timestamp;
}
/* Track HTTP request latency */
pid$target:*:*http*request*:entry
{
self->req_start = timestamp;
}
pid$target:*:*http*request*:return
/self->req_start/
{
@req_latency = quantize(timestamp - self->req_start);
self->req_start = 0;
}
/* Track PostgreSQL queries */
pid$target:*:*query*:entry
{
self->query_start = timestamp;
}
pid$target:*:*query*:return
/self->query_start/
{
@query_latency = quantize(timestamp - self->query_start);
self->query_start = 0;
}
/* Track garbage collection */
pid$target:*:*gc*:entry
{
self->gc_start = timestamp;
}
pid$target:*:*gc*:return
/self->gc_start/
{
@gc_time = quantize(timestamp - self->gc_start);
self->gc_start = 0;
}
/* Report every 10 seconds */
tick-10s
{
printf("\n=== HTTP Request Latency ===\n");
printa(@req_latency);
clear(@req_latency);
printf("\n=== Database Query Latency ===\n");
printa(@query_latency);
clear(@query_latency);
printf("\n=== GC Time ===\n");
printa(@gc_time);
clear(@gc_time);
}
EOF
chmod +x /opt/dtrace/nodejs-monitoring.d
# Run with Node.js PID
sudo /opt/dtrace/nodejs-monitoring.d -p $(pgrep node)

System Metrics:

  • system.cpu.idle, system.cpu.user, system.cpu.kernel
  • system.mem.total, system.mem.used, system.mem.free
  • system.net.bytes_rcvd, system.net.bytes_sent
  • system.io.read_bytes, system.io.write_bytes

ZFS Metrics:

  • zfs.arc.size, zfs.arc.hit_ratio
  • zfs.dataset.used, zfs.dataset.available
  • zfs.pool.health, zfs.pool.fragmentation

Application Metrics:

  • app.http.request_latency (p50, p95, p99)
  • app.db.query_latency
  • app.nodejs.gc_time
  • app.nodejs.heap_used
Terminal window
# Install Go on OpenIndiana
sudo pkg install golang
# Verify Go installation
go version # Should be 1.21+
# Create workspace
mkdir -p /opt/datadog-unix-port
cd /opt/datadog-unix-port
Terminal window
# Clone datadog-unix-agent (hypothetical - check actual repo)
git clone https://github.com/DataDog/datadog-unix-agent.git
cd datadog-unix-agent
# Check for platform-specific code
grep -r "runtime.GOOS" .
grep -r "aix" .
# Create illumos-specific modifications
mkdir -p pkg/collector/illumos
pkg/collector/illumos/cpu.go
package illumos
import (
"os/exec"
"strconv"
"strings"
)
type CPUStats struct {
User float64
Kernel float64
Idle float64
}
func GetCPUStats() (*CPUStats, error) {
// Use kstat to get CPU statistics
cmd := exec.Command("kstat", "-p", "cpu_stat:*:*:user")
output, err := cmd.CombinedOutput()
if err != nil {
return nil, err
}
stats := &CPUStats{}
// Parse kstat output
for _, line := range strings.Split(string(output), "\n") {
fields := strings.Fields(line)
if len(fields) == 2 {
val, _ := strconv.ParseFloat(fields[1], 64)
if strings.Contains(line, "user") {
stats.User = val
}
}
}
return stats, nil
}
pkg/collector/illumos/memory.go
package illumos
import (
"os/exec"
"strconv"
"strings"
)
type MemoryStats struct {
Total uint64
Used uint64
Free uint64
Available uint64
}
func GetMemoryStats() (*MemoryStats, error) {
cmd := exec.Command("kstat", "-p", "unix:0:system_pages:*")
output, err := cmd.CombinedOutput()
if err != nil {
return nil, err
}
stats := &MemoryStats{}
pageSize := uint64(4096) // Typically 4K on x86
for _, line := range strings.Split(string(output), "\n") {
fields := strings.Fields(line)
if len(fields) == 2 {
val, _ := strconv.ParseUint(fields[1], 10, 64)
if strings.Contains(line, "physmem") {
stats.Total = val * pageSize
} else if strings.Contains(line, "freemem") {
stats.Free = val * pageSize
}
}
}
stats.Used = stats.Total - stats.Free
stats.Available = stats.Free
return stats, nil
}
pkg/collector/illumos/zfs.go
package illumos
import (
"os/exec"
"strconv"
"strings"
)
type ZFSStats struct {
ARCSize uint64
ARCHits uint64
ARCMisses uint64
ARCHitRatio float64
}
func GetZFSStats() (*ZFSStats, error) {
cmd := exec.Command("kstat", "-p", "zfs:0:arcstats:*")
output, err := cmd.CombinedOutput()
if err != nil {
return nil, err
}
stats := &ZFSStats{}
for _, line := range strings.Split(string(output), "\n") {
fields := strings.Fields(line)
if len(fields) == 2 {
val, _ := strconv.ParseUint(fields[1], 10, 64)
if strings.Contains(line, ":size") {
stats.ARCSize = val
} else if strings.Contains(line, ":hits") {
stats.ARCHits = val
} else if strings.Contains(line, ":misses") {
stats.ARCMisses = val
}
}
}
if stats.ARCHits+stats.ARCMisses > 0 {
stats.ARCHitRatio = float64(stats.ARCHits) / float64(stats.ARCHits+stats.ARCMisses)
}
return stats, nil
}
Terminal window
# Modify go.mod if needed
go mod init github.com/DataDog/datadog-unix-agent
# Build for illumos
GOOS=solaris GOARCH=amd64 go build -o datadog-agent-illumos ./cmd/agent
# Test the binary
./datadog-agent-illumos version
/etc/datadog-agent/datadog.yaml
api_key: YOUR_DATADOG_API_KEY
hostname: vibecode-openindiana-01
# Logging
log_level: info
log_file: /var/log/datadog/agent.log
# Platform-specific
platform: illumos
enable_zfs_metrics: true
enable_dtrace_integration: true
# Collection intervals
check_interval: 15s
ChallengeSolution
Go syscall package (Linux-specific)Use cgo to call illumos libc
Process monitoring (procfs differences)Implement illumos procfs parser
Network stats (different from Linux)Use kstat for network metrics
Container/Zone detectionUse zone.list() system call
File descriptorsDifferent /proc structure on illumos

Option 4: Native DTrace Agent (Future Development)

Section titled “Option 4: Native DTrace Agent (Future Development)”
  • Native DTrace integration (no external dependencies)
  • SMF-native service lifecycle
  • Zone-aware monitoring
  • ZFS-optimized storage
  • Performance: <1% CPU overhead
vibecode-datadog-illumos/
├── cmd/
│ └── agent/
│ └── main.go
├── pkg/
│ ├── collector/
│ │ ├── dtrace/ # DTrace probe management
│ │ ├── kstat/ # Kernel statistics
│ │ ├── zone/ # Zone-specific metrics
│ │ └── zfs/ # ZFS metrics
│ ├── aggregator/ # Metric aggregation
│ └── forwarder/ # Datadog API client
├── dtrace/
│ ├── system.d # System probes
│ ├── application.d # App-specific probes
│ └── custom.d # User-defined probes
├── manifests/
│ └── datadog-agent.xml # SMF manifest
└── README.md

Phase 1: Core Functionality (MVP)

  • kstat-based system metrics
  • Basic DTrace integration
  • Datadog API forwarder
  • SMF manifest

Phase 2: Advanced Features

  • Zone awareness and per-zone metrics
  • ZFS-specific metrics (ARC, L2ARC, datasets)
  • Custom DTrace probe support
  • Configuration hot-reload

Phase 3: Enterprise Features

  • Multi-zone orchestration
  • DTrace script library
  • Performance profiling integration
  • Advanced alerting

Interested in building the native agent? Join our development effort:

Terminal window
# Clone repository
git clone https://github.com/your-org/vibecode-datadog-illumos.git
cd vibecode-datadog-illumos
# Build
make build
# Run tests
make test
# Submit PR
git checkout -b feature/your-feature
# ... make changes ...
git push origin feature/your-feature
ApproachCPU OverheadMemory UsageNetwork BandwidthDTrace Probes
RapDev Solaris1.5%80MB50KB/s0
StatsD Bridge2.5%120MB100KB/s50+
Unix Agent Port2.0%150MB80KB/s10
Native DTrace0.8%60MB60KB/s200+
Metric TypeRapDevStatsD BridgeUnix AgentNative
CPU/Memory10s10s15s5s
Disk I/O10s5s15s1s
Network10s5s15s1s
Custom AppN/AReal-timeN/AReal-time

Create Datadog dashboard with:

  1. System Health

    • CPU utilization (per-core)
    • Memory usage
    • Swap activity
    • Load average
  2. ZFS Metrics

    • ARC hit ratio
    • L2ARC efficiency
    • Dataset usage
    • Pool health status
  3. Zone Metrics (if using zones)

    • Per-zone CPU allocation
    • Per-zone memory usage
    • Zone network bandwidth
    • Zone count and states
  4. Application Performance

    • HTTP request latency (p50, p95, p99)
    • Database query performance
    • Node.js GC pauses
    • Error rates
  5. Network Performance

    • Bytes in/out
    • Packet errors
    • VNIC statistics (Crossbow)
# Example alert rules
alerts:
- name: "High CPU Usage"
query: "avg(last_5m):avg:system.cpu.user{host:vibecode-*} > 80"
message: "CPU usage above 80% on {{host.name}}"
- name: "Low ZFS ARC Hit Ratio"
query: "avg(last_10m):avg:zfs.arc.hit_ratio{*} < 85"
message: "ZFS ARC hit ratio below 85% - consider increasing ARC size"
- name: "Zone Memory Limit"
query: "avg(last_5m):avg:zone.memory.usage{*} > 90"
message: "Zone {{zone.name}} memory usage above 90%"
- name: "High Request Latency"
query: "avg(last_5m):avg:app.http.request_latency.p95{*} > 1000"
message: "P95 request latency above 1000ms"
# Send custom metrics from application
from datadog import statsd
# Increment counter
statsd.increment('vibecode.user.login', tags=['env:production'])
# Send gauge
statsd.gauge('vibecode.queue.size', 42)
# Send histogram
statsd.histogram('vibecode.processing.time', 234.5)
# Send timing
with statsd.timed('vibecode.db.query'):
# Database query
pass
Terminal window
# Check agent status (RapDev)
svcs -l datadog-agent
# Check agent logs
tail -f /var/log/datadog-agent.log
# Test Datadog API connectivity
curl -v -H "DD-API-KEY: YOUR_API_KEY" \
"https://api.datadoghq.com/api/v1/validate"
# Check StatsD listener
netstat -an | grep 8125
# Test StatsD manually
echo "test.metric:1|c" | nc -u -w1 localhost 8125
Terminal window
# Check DTrace permissions
dtrace -l | head
# Test specific probe
dtrace -n 'BEGIN { printf("DTrace working!\n"); exit(0); }'
# Check for probe conflicts
dtrace -l | grep -c probe
# Enable DTrace debugging
dtrace -x dynvarsize=256m -x aggsize=256m
Terminal window
# Monitor agent resource usage
prstat -s cpu | grep -E 'agent|statsd'
# Check probe count
dtrace -l | wc -l
# Reduce collection frequency
# Edit /etc/datadog-agent/datadog.yaml
check_interval: 30s # Increase from 15s
# Disable expensive collectors
enable_io_latency: false
Terminal window
# Verify kstat access
kstat -m zfs
# Check ZFS module loaded
modinfo | grep zfs
# Test metric collection
kstat -p zfs:0:arcstats:size
Terminal window
# Store API key securely (not in config file)
echo "YOUR_API_KEY" > /etc/datadog-agent/api_key
chmod 600 /etc/datadog-agent/api_key
chown root:root /etc/datadog-agent/api_key
# Reference in config
api_key_file: /etc/datadog-agent/api_key
Terminal window
# Restrict DTrace to specific users
usermod -K defaultpriv=basic,dtrace_proc,dtrace_user vibecode
# Audit DTrace usage
auditconfig -setpolicy +argv,+group
auditconfig -setflags lo,ad,ex,-ap
Terminal window
# Encrypt metrics in transit (TLS)
use_ssl: true
ssl_verify: true
# Restrict StatsD listener to localhost
bind_host: 127.0.0.1
# Reduce metric cardinality
exclude_tags:
- "container_id"
- "pod_uid"
# Aggregate before sending
aggregation_interval: 60s
# Sample high-volume metrics
metrics_config:
- name: "system.net.*"
sample_rate: 0.1 # Sample 10% of metrics
# Configure retention in Datadog UI
# Keep only 15-day retention for high-volume metrics
# Use longer retention for critical business metrics
  1. Choose Integration Approach: Based on your requirements and resources
  2. Deploy Test Environment: Set up on non-production OpenIndiana system
  3. Configure Metrics: Start with system metrics, expand to application metrics
  4. Create Dashboards: Visualize your metrics in Datadog
  5. Set Up Alerts: Configure proactive monitoring
  6. Optimize: Fine-tune collection intervals and metric selection

Back to: OpenIndiana Platform Guide