static void statsd_run_recvmsg(struct brubeck_statsd *statsd, int sock) { struct brubeck_server *server = statsd->sampler.server; struct brubeck_statsd_msg msg; struct brubeck_metric *metric; char buffer[MAX_PACKET_SIZE]; struct sockaddr_in reporter; socklen_t reporter_len = sizeof(reporter); memset(&reporter, 0, reporter_len); log_splunk("sampler=statsd event=worker_online syscall=recvmsg socket=%d", sock); for (;;) { int res = recvfrom(sock, buffer, sizeof(buffer) - 1, 0, (struct sockaddr *)&reporter, &reporter_len); if (res < 0) { if (errno == EAGAIN || errno == EINTR) continue; log_splunk_errno("sampler=statsd event=failed_read from=%s", inet_ntoa(reporter.sin_addr)); brubeck_server_mark_dropped(server); continue; } /* store stats */ brubeck_atomic_inc(&server->stats.metrics); brubeck_atomic_inc(&statsd->sampler.inflow); if (brubeck_statsd_msg_parse(&msg, buffer, (size_t) res) < 0) { if (msg.key_len > 0) buffer[msg.key_len] = ':'; log_splunk("sampler=statsd event=bad_key key='%.*s' from=%s", res, buffer, inet_ntoa(reporter.sin_addr)); brubeck_server_mark_dropped(server); continue; } metric = brubeck_metric_find(server, msg.key, msg.key_len, msg.type); if (metric != NULL) { brubeck_metric_record(metric, msg.value); } } }
static void statsd_run_recvmsg(struct brubeck_statsd *statsd, int sock) { struct brubeck_server *server = statsd->sampler.server; char *buffer = xmalloc(MAX_PACKET_SIZE); struct sockaddr_in reporter; socklen_t reporter_len = sizeof(reporter); memset(&reporter, 0, reporter_len); log_splunk("sampler=statsd event=worker_online syscall=recvmsg socket=%d", sock); for (;;) { int res = recvfrom(sock, buffer, MAX_PACKET_SIZE - 1, 0, (struct sockaddr *)&reporter, &reporter_len); if (res < 0) { if (errno == EAGAIN || errno == EINTR) continue; log_splunk_errno("sampler=statsd event=failed_read from=%s", inet_ntoa(reporter.sin_addr)); brubeck_stats_inc(server, errors); continue; } brubeck_atomic_inc(&statsd->sampler.inflow); brubeck_statsd_packet_parse(server, buffer, buffer + res); } }