summaryrefslogtreecommitdiff
path: root/src/ftp_decoder_stat.cpp
blob: ac5f1cecbbddb72be92086b35f6bacf6b7cb603e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <assert.h>
#include <fieldstat/fieldstat_easy.h>
#include "ftp_decoder_stat.h"
#include "ftp_decoder_inner.h"
#include "ftp_decoder_util.h"

static const struct ftpd_stat_config_tuple g_ftpd_stat_tuple[] =
    {
        {FTPD_STAT_CTRL_LINK_OPEN, "clink_open"},
        {FTPD_STAT_CTRL_LINK_CLOSE, "clink_close"},
        {FTPD_STAT_DATA_LINK_OPEN, "dlink_open"},
        {FTPD_STAT_DATA_LINK_CLOSE, "dlink_close"},
        {FTPD_STAT_NEGOTIATE_DATA_LINK, "negotiate_dlink"},
        {FTPD_STAT_CTRL_LINK_BYTES_C2S, "clink_bytes_c2s"},
        {FTPD_STAT_CTRL_LINK_BYTES_S2C, "clink_bytes_s2c"},
        {FTPD_STAT_DATA_LINK_BYTES_C2S, "dlink_bytes_c2s"},
        {FTPD_STAT_DATA_LINK_BYTES_S2C, "dlink_bytes_s2c"},
        {FTPD_STAT_CTRL_CMD, "ctrl_cmd"},
};

void ftp_decoder_stat_incrby(int thread_idx, struct ftp_decoder_env *fenv, enum ftp_decoder_stat_type stattype, long long increment)
{
    if (fenv->fstat.fs4_instance)
    {
        fieldstat_easy_counter_incrby(fenv->fstat.fs4_instance, thread_idx, fenv->fstat.fs4_counter_id[stattype], NULL, 0, increment);
    }
}

int ftp_decoder_stat_init(struct ftp_decoder_env *fenv)
{
    assert(sizeof(g_ftpd_stat_tuple) / sizeof(struct ftpd_stat_config_tuple) == FTPD_STAT_MAX);
    fenv->fstat.fs4_instance = fieldstat_easy_new(fenv->thread_count, FTP_DECODER_FIELDSTAT_NAME, NULL, 0);

    for (int i = 0; i < FTPD_STAT_MAX; i++)
    {
        fenv->fstat.fs4_counter_id[i] = fieldstat_easy_register_counter(fenv->fstat.fs4_instance, g_ftpd_stat_tuple[i].name);
    }
    ftp_mkdir_p("./metrics", 0644);
    int ret = fieldstat_easy_enable_auto_output(fenv->fstat.fs4_instance, FTP_DECODER_FIELDSTAT_OUTPUT_FILE, FTP_DECODER_FIELDSTAT_OUTPUT_INTERVAL);
    if (ret < 0)
    {
        fprintf(stderr, "fieldstat_easy_enable_auto_output '%s' failed\n", FTP_DECODER_FIELDSTAT_OUTPUT_FILE);
        fieldstat_easy_free(fenv->fstat.fs4_instance);
        fenv->fstat.fs4_instance = NULL;
        return -1;
    }
    return 0;
}

void ftp_decoder_stat_free(struct ftp_decoder_env *fenv)
{
    fieldstat_easy_free(fenv->fstat.fs4_instance);
    fenv->fstat.fs4_instance = NULL;
}