Saltar al contenido principal

Ingesta Manual mediante API REST 🔌

Para desarrolladores que no utilizan OpenTelemetry o que prefieren instrumentar de manera manual e ingresar métricas, trazas o logs directamente a través de peticiones HTTP tradicionales de alto rendimiento, API Monitor APM expone un conjunto de endpoints REST JSON unificados.


🔒 Seguridad y Autorización

Todas las peticiones HTTP enviadas a los endpoints de la API deben autenticarse de forma obligatoria adjuntando tu token de API del Workspace en la cabecera:

api-key-newinntech: TU_API_KEY_AQUÍ

La URL base de la API de ingesta es: http://localhost:3000/api/v1/telemetry (reemplaza localhost:3000 por tu host de producción).


📡 Endpoints de Ingesta Manual

1. Ingesta de Trazas (Traces & Spans)

  • Ruta: POST /traces
  • Payload (JSON):
    {
    "serviceName": "mi-servicio-personalizado",
    "environment": "production",
    "spans": [
    {
    "traceId": "5f280d19e6e29f59ceb4b4eeb8d86921",
    "spanId": "dd9081f5986d98c5",
    "parentId": "",
    "name": "GET /api/data",
    "startTimeUnixNano": "1784219768469000000",
    "endTimeUnixNano": "1784219768499000000",
    "status": {
    "code": "OK"
    },
    "attributes": {
    "http.method": "GET",
    "http.status_code": 200
    }
    }
    ]
    }

2. Ingesta de Logs

  • Ruta: POST /logs
  • Payload (JSON):
    {
    "serviceName": "mi-servicio-personalizado",
    "environment": "production",
    "logs": [
    {
    "timestampUnixNano": "1784219768469000000",
    "severity": "INFO",
    "traceId": "5f280d19e6e29f59ceb4b4eeb8d86921",
    "spanId": "dd9081f5986d98c5",
    "body": "Petición procesada exitosamente en el servidor",
    "attributes": {
    "component": "http-handler"
    }
    }
    ]
    }

3. Ingesta de Métricas

  • Ruta: POST /metrics
  • Payload (JSON):
    {
    "serviceName": "mi-servicio-personalizado",
    "environment": "production",
    "metrics": [
    {
    "name": "cpu.utilization",
    "type": "gauge",
    "dataPoints": [
    {
    "timestampUnixNano": "1784219768469000000",
    "value": 42.5,
    "attributes": {
    "core": "cpu0"
    }
    }
    ]
    }
    ]
    }

📟 Ejemplo de Consumo en Node.js (JavaScript)

El siguiente script completo e independiente muestra cómo enviar trazas y logs correlacionados utilizando la librería axios en Node.js de forma manual:

const axios = require('axios');

const API_KEY = '68de6b3c-1be3-45c8-a80c-a19d333f49ec'; // Tu API Key
const BASE_URL = 'http://localhost:3000/api/v1/telemetry';

async function sendManualTelemetry() {
const traceId = '5f280d19e6e29f59ceb4b4eeb8d86921';
const spanId = 'dd9081f5986d98c5';
const nowNano = String(Date.now() * 1000000);

const headers = {
'Content-Type': 'application/json',
'api-key-newinntech': API_KEY
};

try {
// 1. Enviar Span de Traza manual
await axios.post(`${BASE_URL}/traces`, {
serviceName: 'my-custom-node-app',
environment: 'production',
spans: [{
traceId,
spanId,
parentId: '',
name: 'database-query-test',
startTimeUnixNano: nowNano,
endTimeUnixNano: String(Number(nowNano) + 15000000), // Duración 15ms
status: { code: 'OK' },
attributes: { 'db.system': 'postgresql', 'db.operation': 'SELECT' }
}]
}, { headers });

// 2. Enviar Log correlacionado
await axios.post(`${BASE_URL}/logs`, {
serviceName: 'my-custom-node-app',
environment: 'production',
logs: [{
timestampUnixNano: nowNano,
severity: 'INFO',
traceId,
spanId,
body: 'Conexión a base de datos establecida y consulta SELECT ejecutada',
attributes: { 'module': 'db-connector' }
}]
}, { headers });

console.log('✅ Telemetría manual reportada con éxito a API Monitor.');
} catch (error) {
console.error('❌ Error en el reporte de telemetría:', error.response ? error.response.data : error.message);
}
}

sendManualTelemetry();

🐍 Ejemplo de Consumo en Python

El siguiente script muestra cómo reportar métricas físicas personalizadas a API Monitor utilizando la librería estándar de requests en Python:

import requests
import time

API_KEY = "68de6b3c-1be3-45c8-a80c-a19d333f49ec" # Tu API Key
BASE_URL = "http://localhost:3000/api/v1/telemetry"

def send_python_metrics():
now_nano = str(int(time.time() * 1000000000))

headers = {
"Content-Type": "application/json",
"api-key-newinntech": API_KEY
}

payload = {
"serviceName": "python-worker-service",
"environment": "production",
"metrics": [
{
"name": "worker.memory.usage",
"type": "gauge",
"dataPoints": [
{
"timestampUnixNano": now_nano,
"value": 256.45, # RAM en MB
"attributes": {
"process.name": "celery-worker-1",
"region": "us-east-1"
}
}
]
}
]
}

try:
response = requests.post(f"{BASE_URL}/metrics", json=payload, headers=headers)
if response.status_code == 202:
print("✅ Métricas físicas de Python reportadas con éxito.")
else:
print(f"⚠️ Error {response.status_code}: {response.text}")
except Exception as e:
print(f"❌ Error de conexión: {str(e)}")

send_python_metrics()