ebpf_exporter
58 строк · 1.5 Кб
1#include <vmlinux.h>
2#include <bpf/bpf_tracing.h>
3#include "maps.bpf.h"
4
5// 17 buckets for backlog sizes, max range is 64k..128k
6#define MAX_BUCKET_SLOT 17
7
8// Address on which docker accepts connections
9#define DOCKER_SOCK_ADDR_PATH "/var/run/docker.sock"
10
11// Keep in sync with static_map in the config
12enum unix_addr {
13DOCKER_SOCK_ADDR,
14MAX_PATHS // Max number of paths to track
15};
16
17struct key_t {
18enum unix_addr addr;
19u64 bucket;
20};
21
22struct {
23__uint(type, BPF_MAP_TYPE_HASH);
24__uint(max_entries, (MAX_BUCKET_SLOT + 2) * MAX_PATHS);
25__type(key, struct key_t);
26__type(value, u64);
27} unix_socket_backlog SEC(".maps");
28
29// https://elixir.bootlin.com/linux/v6.6-rc1/source/include/linux/skbuff.h#L2133
30static inline __u32 skb_queue_len(const struct sk_buff_head *list_)
31{
32return list_->qlen;
33}
34
35static int do_count(enum unix_addr addr, u64 backlog)
36{
37struct key_t key = {};
38
39key.addr = addr;
40
41increment_exp2zero_histogram(&unix_socket_backlog, key, backlog, MAX_BUCKET_SLOT);
42
43return 0;
44}
45
46SEC("fexit/unix_find_other")
47int BPF_PROG(unix_find_other, struct net *net, struct sockaddr_un *sunaddr, int addr_len, int type, struct sock *other)
48{
49// Make sure to use clang-15, otherwise you might see:
50// libbpf: failed to find BTF for extern 'memcmp': -2
51if (__builtin_memcmp(sunaddr->sun_path, DOCKER_SOCK_ADDR_PATH, sizeof(DOCKER_SOCK_ADDR_PATH)) == 0) {
52return do_count(DOCKER_SOCK_ADDR, skb_queue_len(&other->sk_receive_queue));
53}
54
55return 0;
56}
57
58char LICENSE[] SEC("license") = "GPL";
59