![]() |
1 year ago | |
---|---|---|
.. | ||
tests | 1 year ago | |
README.md | 1 year ago | |
dyn_conf.c | 1 year ago | |
dyn_conf.h | 1 year ago |
Purpose of Netdata Dynamic Configuration is to allow configuration of select Netdata plugins and options through the
Netdata API and by extension by UI.
For summary of all jobs and their statuses (for all children that stream to parent) use the following URL:
| Method | Endpoint | Description |
|:-------:|-------------------------------|------------------------------------------------------------|
| GET | api/v2/job_statuses
| list of Jobs |
| GET | api/v2/job_statuses?grouped
| list of Jobs (hierarchical, grouped by host/plugin/module) |
| Method | Endpoint | Description |
|:-------:|------------------|-----------------------------------------|
| GET | /api/v2/config
| registered Plugins (sent DYNCFG_ENABLE) |
| Method | Endpoint | Description |
|:-------:|-----------------------------------|------------------------------|
| GET | /api/v2/config/[plugin]
| Plugin config |
| PUT | /api/v2/config/[plugin]
| update Plugin config |
| GET | /api/v2/config/[plugin]/modules
| Modules registered by Plugin |
| GET | /api/v2/config/[plugin]/schema
| Plugin config schema |
| Method | Endpoint | Description |
|:-------:|-----------------------------------------------|---------------------------|
| GET | /api/v2/config/<plugin>/[module]
| Module config |
| PUT | /api/v2/config/[plugin]/[module]
| update Module config |
| GET | /api/v2/config/[plugin]/[module]/jobs
| Jobs registered by Module |
| GET | /api/v2/config/[plugin]/[module]/job_schema
| Job config schema |
| GET | /api/v2/config/[plugin]/[module]/schema
| Module config schema |
module_type == job_array
| Method | Endpoint | Description |
|:----------:|------------------------------------------|--------------------------------|
| GET | /api/v2/config/[plugin]/[module]/[job]
| Job config |
| PUT | /api/v2/config/[plugin]/[module]/[job]
| update Job config |
| POST | /api/v2/config/[plugin]/[module]/[job]
| create Job |
| DELETE | /api/v2/config/[plugin]/[module]/[job]
| delete Job (created by Dyncfg) |
TBD
Plugin signifies to agent its ability to use new dynamic config and the name it wishes to use by sending
DYNCFG_ENABLE [{PLUGIN_NAME}]
This can be sent only once per lifetime of the plugin (at startup or later) sending it multiple times is considered a
protocol violation and plugin might get terminated.
After this command is sent the plugin has to be ready to accept all the new commands/keywords related to dynamic
configuration (this command lets agent know this plugin is dyncfg capable and wishes to use dyncfg functionality).
Sending this, will reset the internal state of the agent, considering this a DYNCFG_ENABLE
.
DYNCFG_RESET
DYNCFG_REGISTER_MODULE {MODULE_NAME} {MODULE_TYPE}
Module has to choose one of following types at registration:
single
- module itself has configuration but does not accept any jobs (this is useful mainly for internal netdata
configurable things like webserver etc.)
job_array
- module itself can (not must) have configuration and it has an array of jobs which can be added,
modified and deleted. this is what plugin developer needs in most cases
After a module has been registered agent can call set_module_config
, get_module_config
and get_module_config_schema
.
When MODULE_TYPE
is job_array
the agent may also send set_job_config
, get_job_config
and get_job_config_schema
.
The plugin can use DYNCFG_REGISTER_JOB
to register its own configuration jobs. It should not register jobs configured
via DYNCFG (doing so, the agent will shutdown the plugin).
DYNCFG_REGISTER_JOB {MODULE_NAME} {JOB_NAME} {JOB_TYPE} {FLAGS}
Where:
MODULE_NAME
is the name of the module.JOB_NAME
is the name of the job.JOB_TYPE
is either stock
or autodiscovered
.FLAGS
, just send zero.REPORT_JOB_STATUS {MODULE_NAME} {JOB_NAME} {STATUS} {STATE} ["REASON"]
Note the REASON parameter is optional and can be entirelly ommited (for example when state is OK there is no need to send any reason).
Where:
MODULE_NAME
is the name of the module.JOB_NAME
is the name of the job.STATUS
is one of stopped
, running
, or error
.STATE
, just send zero.REASON
is a message describing the status. In case you don't want to send any reason string it is preferable to omit this parameter altogether (as opposed to sending empty string ""
).Once a plugin calls DYNCFG_ENABLE
, the must be able to handle these calls.
function | parameters | prerequisites | request payload | response payload |
---|---|---|---|---|
set_plugin_config |
none | DYNCFG_ENABLE |
plugin configuration | none |
get_plugin_config |
none | DYNCFG_ENABLE |
none | plugin configuration |
get_plugin_config_schema |
none | DYNCFG_ENABLE |
none | plugin configuration schema |
set_module_config |
module_name |
DYNCFG_REGISTER_MODULE |
module configuration | none |
get_module_config |
module_name |
DYNCFG_REGISTER_MODULE |
none | module configuration |
get_module_config_schema |
module_name |
DYNCFG_REGISTER_MODULE |
none | module configuration schema |
set_job_config |
module_name , job_name |
DYNCFG_REGISTER_MODULE |
job configuration | none |
get_job_config |
module_name , job_name |
DYNCFG_REGISTER_MODULE |
none | job configuration |
get_job_config_schema |
module_name , job_name |
DYNCFG_REGISTER_MODULE |
none | job configuration schema |
All of them work like this:
If the request payload is none
, then the request looks like this:
FUNCTION {TRANSACTION_UUID} {TIMEOUT_SECONDS} "{function} {parameters}"
When there is payload, the request looks like this:
FUNCTION_PAYLOAD {TRANSACTION_UUID} {TIMEOUT_SECONDS} "{function} {parameters}"
<payload>
FUNCTION_PAYLOAD_END
In all cases, the response is like this:
FUNCTION_RESULT_BEGIN {TRANSACTION_UUID} {HTTP_RESPONSE_CODE} "{CONTENT_TYPE}" {EXPIRATION_TIMESTAMP}
<payload>
FUNCTION_RESULT_END
Where:
TRANSACTION_UUID
is the same UUID received with the request.HTTP_RESPONSE_CODE
is either 0
(rejected) or 1
(accepted).CONTENT_TYPE
should reflect the payload
returned.EXPIRATION_TIMESTAMP
can be zero.When above commands are transferred trough streaming additionally plugin_name
is prefixed as first parameter. This is
done to allow routing to appropriate plugin @child.
As a plugin developer you don't need to concern yourself with this detail as that parameter is stripped when sent to the
plugin (and added when sent trough streaming) automagically.