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;
}
|