parser.h 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. // SPDX-License-Identifier: GPL-3.0-or-later
  2. #ifndef NETDATA_INCREMENTAL_PARSER_H
  3. #define NETDATA_INCREMENTAL_PARSER_H 1
  4. #include "daemon/common.h"
  5. #define PARSER_MAX_CALLBACKS 20
  6. #define PARSER_MAX_RECOVER_KEYWORDS 128
  7. // PARSER return codes
  8. typedef enum parser_rc {
  9. PARSER_RC_OK, // Callback was successful, go on
  10. PARSER_RC_STOP, // Callback says STOP
  11. PARSER_RC_ERROR // Callback failed (abort rest of callbacks)
  12. } PARSER_RC;
  13. typedef struct pluginsd_action {
  14. PARSER_RC (*set_action)(void *user, RRDSET *st, RRDDIM *rd, long long int value);
  15. PARSER_RC (*begin_action)(void *user, RRDSET *st, usec_t microseconds, int trust_durations);
  16. PARSER_RC (*end_action)(void *user, RRDSET *st);
  17. PARSER_RC (*chart_action)
  18. (void *user, char *type, char *id, char *name, char *family, char *context, char *title, char *units, char *plugin,
  19. char *module, int priority, int update_every, RRDSET_TYPE chart_type, char *options);
  20. PARSER_RC (*dimension_action)
  21. (void *user, RRDSET *st, char *id, char *name, char *algorithm, long multiplier, long divisor, char *options,
  22. RRD_ALGORITHM algorithm_type);
  23. PARSER_RC (*flush_action)(void *user, RRDSET *st);
  24. PARSER_RC (*disable_action)(void *user);
  25. PARSER_RC (*variable_action)(void *user, RRDHOST *host, RRDSET *st, char *name, int global, NETDATA_DOUBLE value);
  26. PARSER_RC (*label_action)(void *user, char *key, char *value, RRDLABEL_SRC source);
  27. PARSER_RC (*overwrite_action)(void *user, RRDHOST *host, DICTIONARY *new_labels);
  28. PARSER_RC (*clabel_action)(void *user, char *key, char *value, RRDLABEL_SRC source);
  29. PARSER_RC (*clabel_commit_action)(void *user, RRDHOST *host, DICTIONARY *new_labels);
  30. PARSER_RC (*guid_action)(void *user, uuid_t *uuid);
  31. PARSER_RC (*context_action)(void *user, uuid_t *uuid);
  32. PARSER_RC (*tombstone_action)(void *user, uuid_t *uuid);
  33. PARSER_RC (*host_action)(void *user, char *machine_guid, char *hostname, char *registry_hostname, int update_every, char *os,
  34. char *timezone, char *tags);
  35. } PLUGINSD_ACTION;
  36. typedef enum parser_input_type {
  37. PARSER_INPUT_SPLIT = 1 << 1,
  38. PARSER_INPUT_ORIGINAL = 1 << 2,
  39. PARSER_INPUT_PROCESSED = 1 << 3,
  40. PARSER_NO_PARSE_INIT = 1 << 4,
  41. PARSER_NO_ACTION_INIT = 1 << 5,
  42. } PARSER_INPUT_TYPE;
  43. #define PARSER_INPUT_FULL (PARSER_INPUT_SPLIT|PARSER_INPUT_ORIGINAL)
  44. typedef PARSER_RC (*keyword_function)(char **, void *, PLUGINSD_ACTION *plugins_action);
  45. typedef struct parser_keyword {
  46. size_t worker_job_id;
  47. char *keyword;
  48. uint32_t keyword_hash;
  49. int func_no;
  50. keyword_function func[PARSER_MAX_CALLBACKS+1];
  51. struct parser_keyword *next;
  52. } PARSER_KEYWORD;
  53. typedef struct parser_data {
  54. char *line;
  55. struct parser_data *next;
  56. } PARSER_DATA;
  57. typedef struct parser {
  58. size_t worker_job_ids;
  59. uint8_t version; // Parser version
  60. RRDHOST *host;
  61. void *input; // Input source e.g. stream
  62. PARSER_DATA *data; // extra input
  63. PARSER_KEYWORD *keyword; // List of parse keywords and functions
  64. PLUGINSD_ACTION *plugins_action;
  65. void *user; // User defined structure to hold extra state between calls
  66. uint32_t flags;
  67. char *(*read_function)(char *buffer, long unsigned int, void *input);
  68. int (*eof_function)(void *input);
  69. keyword_function unknown_function;
  70. char buffer[PLUGINSD_LINE_MAX];
  71. char *recover_location[PARSER_MAX_RECOVER_KEYWORDS+1];
  72. char recover_input[PARSER_MAX_RECOVER_KEYWORDS];
  73. #ifdef ENABLE_HTTPS
  74. int bytesleft;
  75. char tmpbuffer[PLUGINSD_LINE_MAX];
  76. char *readfrom;
  77. #endif
  78. } PARSER;
  79. PARSER *parser_init(RRDHOST *host, void *user, void *input, PARSER_INPUT_TYPE flags);
  80. int parser_add_keyword(PARSER *working_parser, char *keyword, keyword_function func);
  81. int parser_next(PARSER *working_parser);
  82. int parser_action(PARSER *working_parser, char *input);
  83. int parser_push(PARSER *working_parser, char *line);
  84. void parser_destroy(PARSER *working_parser);
  85. int parser_recover_input(PARSER *working_parser);
  86. extern size_t pluginsd_process(RRDHOST *host, struct plugind *cd, FILE *fp, int trust_durations);
  87. extern PARSER_RC pluginsd_set(char **words, void *user, PLUGINSD_ACTION *plugins_action);
  88. extern PARSER_RC pluginsd_begin(char **words, void *user, PLUGINSD_ACTION *plugins_action);
  89. extern PARSER_RC pluginsd_end(char **words, void *user, PLUGINSD_ACTION *plugins_action);
  90. extern PARSER_RC pluginsd_chart(char **words, void *user, PLUGINSD_ACTION *plugins_action);
  91. extern PARSER_RC pluginsd_dimension(char **words, void *user, PLUGINSD_ACTION *plugins_action);
  92. extern PARSER_RC pluginsd_variable(char **words, void *user, PLUGINSD_ACTION *plugins_action);
  93. extern PARSER_RC pluginsd_flush(char **words, void *user, PLUGINSD_ACTION *plugins_action);
  94. extern PARSER_RC pluginsd_disable(char **words, void *user, PLUGINSD_ACTION *plugins_action);
  95. extern PARSER_RC pluginsd_label(char **words, void *user, PLUGINSD_ACTION *plugins_action);
  96. extern PARSER_RC pluginsd_overwrite(char **words, void *user, PLUGINSD_ACTION *plugins_action);
  97. extern PARSER_RC pluginsd_guid(char **words, void *user, PLUGINSD_ACTION *plugins_action);
  98. extern PARSER_RC pluginsd_context(char **words, void *user, PLUGINSD_ACTION *plugins_action);
  99. extern PARSER_RC pluginsd_tombstone(char **words, void *user, PLUGINSD_ACTION *plugins_action);
  100. extern PARSER_RC pluginsd_clabel_commit(char **words, void *user, PLUGINSD_ACTION *plugins_action);
  101. extern PARSER_RC pluginsd_clabel(char **words, void *user, PLUGINSD_ACTION *plugins_action);
  102. #endif