watchlog-metric
Version:
This is a package to communicate with watchlog.io agent
102 lines (80 loc) • 2.56 kB
text/typescript
import axios from 'axios';
declare function require(name: string): any;
const fs = require('fs');
const dns = require('dns');
const { promisify } = require('util');
const lookup = promisify(dns.lookup);
async function isRunningInK8s(): Promise<boolean> {
const tokenPath = '/var/run/secrets/kubernetes.io/serviceaccount/token';
if (fs.existsSync(tokenPath)) {
return true;
}
try {
const content = fs.readFileSync('/proc/1/cgroup', 'utf8');
if (content.includes('kubepods')) {
return true;
}
} catch {
// ignore
}
try {
await lookup('kubernetes.default.svc.cluster.local');
return true;
} catch {
return false;
}
}
let cachedServerURL: string | null = null;
async function getServerURL(userProvidedUrl?: string): Promise<string> {
// If user explicitly provided a URL, use it directly (skip auto-detection)
if (userProvidedUrl) {
return userProvidedUrl;
}
if (cachedServerURL) return cachedServerURL;
if (await isRunningInK8s()) {
cachedServerURL = 'http://watchlog-node-agent.monitoring.svc.cluster.local:3774';
} else {
cachedServerURL = 'http://127.0.0.1:3774';
}
return cachedServerURL;
}
class SocketCli {
private agentUrl?: string;
constructor(agentUrl?: string) {
this.agentUrl = agentUrl;
}
async #sendMetric(method: string, metric: string, value = 1): Promise<void> {
if (typeof metric !== 'string' || typeof value !== 'number') {
return;
}
const baseURL = await getServerURL(this.agentUrl);
const url = `${baseURL}?method=${method}&metric=${encodeURIComponent(metric)}&value=${value}`;
axios.get(url).catch(() => {
// Fail silently
});
}
increment(metric: string, value = 1): void {
if (value > 0) this.#sendMetric('increment', metric, value);
}
decrement(metric: string, value = 1): void {
if (value > 0) this.#sendMetric('decrement', metric, value);
}
distribution(metric: string, value: number): void {
this.#sendMetric('distribution', metric, value);
}
gauge(metric: string, value: number): void {
this.#sendMetric('gauge', metric, value);
}
percentage(metric: string, value: number): void {
if (value >= 0 && value <= 100) {
this.#sendMetric('percentage', metric, value);
} else {
console.error(`Percentage out of range [0–100]: ${value}`);
}
}
systembyte(metric: string, value: number): void {
if (value > 0) this.#sendMetric('systembyte', metric, value);
}
}
export default new SocketCli();
export { SocketCli };