14#if DETWS_ENABLE_UDP_TELEMETRY
23static void line_append(DetwsLine *l,
const char *s)
27 size_t n = strnlen(s, l->cap + 1);
28 if (l->pos + n >= l->cap)
33 memcpy(l->buf + l->pos, s, n);
35 l->buf[l->pos] =
'\0';
39static void line_sep(DetwsLine *l)
41 line_append(l, l->have_fields ?
"," :
" ");
42 l->have_fields =
true;
45void detws_line_init(DetwsLine *l,
char *buf,
size_t cap,
const char *measurement)
51 l->have_fields =
false;
54 line_append(l, measurement ? measurement :
"");
59static void line_append_escaped(DetwsLine *l,
const char *s)
63 for (
const char *p = s; *p; p++)
65 if (*p ==
',' || *p ==
'=' || *p ==
' ')
67 char esc[3] = {
'\\', *p,
'\0'};
72 char one[2] = {*p,
'\0'};
78void detws_line_add_tag(DetwsLine *l,
const char *key,
const char *val)
89 line_append_escaped(l, key);
91 line_append_escaped(l, val);
94void detws_line_set_timestamp(DetwsLine *l, int64_t timestamp)
102 snprintf(num,
sizeof(num),
" %lld", (
long long)timestamp);
106void detws_line_add_int(DetwsLine *l,
const char *field, int64_t v)
109 snprintf(num,
sizeof(num),
"%lldi", (
long long)v);
111 line_append(l, field);
116void detws_line_add_uint(DetwsLine *l,
const char *field, uint64_t v)
119 snprintf(num,
sizeof(num),
"%lluu", (
unsigned long long)v);
121 line_append(l, field);
126void detws_line_add_float(DetwsLine *l,
const char *field,
float v, uint8_t decimals)
129 snprintf(num,
sizeof(num),
"%.*f", (
int)decimals, (
double)v);
131 line_append(l, field);
136size_t detws_line_len(
const DetwsLine *l)
141bool detws_line_ok(
const DetwsLine *l)
143 return !l->overflow && l->have_fields;
158struct UdpTelemetryCtx
167void detws_udp_telemetry_begin(
const char *collector_ip, uint16_t port)
169 strncpy(s_ut.ip, collector_ip ? collector_ip :
"", sizeof(s_ut.ip) - 1);
170 s_ut.ip[
sizeof(s_ut.ip) - 1] =
'\0';
175bool detws_udp_telemetry_send(
const char *data,
size_t len)
177 if (!s_ut.begun || !data)
179 return det_udp_sendto(s_ut.ip, s_ut.port, (
const uint8_t *)data, len);
184void detws_udp_telemetry_begin(
const char *, uint16_t)
188bool detws_udp_telemetry_send(
const char *,
size_t)
195bool detws_udp_telemetry_cast(
const DetwsLine *l)
197 if (!detws_line_ok(l))
199 return detws_udp_telemetry_send(l->buf, l->pos);
bool det_udp_sendto(const char *dst_ip, uint16_t dst_port, const uint8_t *data, size_t len)
Send a UDP datagram to an arbitrary destination (outbound client).
Layer 4 (Transport) - connectionless UDP datagram service.
Fire-and-forget UDP telemetry cast (DETWS_ENABLE_UDP_TELEMETRY).