Skip to content
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion plugins/out_datadog/datadog.c
Original file line number Diff line number Diff line change
Expand Up @@ -581,7 +581,10 @@ static struct flb_config_map config_map[] = {
0, FLB_TRUE, offsetof(struct flb_out_datadog, json_date_key),
"Date key name for output."
},

{
FLB_CONFIG_MAP_STR, "site", NULL, 0, FLB_FALSE, offsetof(struct flb_out_datadog, site),
"DataDog site for telemetry data (e.g., 'datadoghq.eu', 'datadoghq.com', 'us3.datadoghq.com'). The plugin will construct the full hostname by prepending 'http-intake.logs.' to this value."
},
/* EOF */
{0}
};
Expand Down
1 change: 1 addition & 0 deletions plugins/out_datadog/datadog.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ struct flb_out_datadog {
flb_sds_t tag_key;
struct mk_list *headers;
bool remap;
flb_sds_t site;

/* final result */
flb_sds_t json_date_key;
Expand Down
62 changes: 53 additions & 9 deletions plugins/out_datadog/datadog_conf.c
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ struct flb_out_datadog *flb_datadog_conf_create(struct flb_output_instance *ins,
char *host = NULL;
char *port = NULL;
char *uri = NULL;
char *site = NULL;

/* Start resource creation */
ctx = flb_calloc(1, sizeof(struct flb_out_datadog));
Expand Down Expand Up @@ -98,6 +99,20 @@ struct flb_out_datadog *flb_datadog_conf_create(struct flb_output_instance *ins,
return NULL;
}

/* Parse site parameter early so it's available for host construction */
tmp = flb_output_get_property("site", ins);
if (tmp){
ctx->site = flb_sds_create(tmp);
if (!ctx->site) {
flb_plg_error(ctx->ins, "failed to allocate memory for site parameter");
flb_datadog_conf_destroy(ctx);
return NULL;
}
flb_plg_debug(ctx->ins, "site parameter set to: %s", ctx->site);
} else {
flb_plg_debug(ctx->ins, "no site parameter found");
}

/* Tag Key */
if (ctx->include_tag_key == FLB_TRUE) {
ctx->nb_additional_entries++;
Expand Down Expand Up @@ -126,7 +141,7 @@ struct flb_out_datadog *flb_datadog_conf_create(struct flb_output_instance *ins,
tmp = flb_output_get_property("provider", ins);
ctx->remap = tmp && (strlen(tmp) == strlen(FLB_DATADOG_REMAP_PROVIDER)) && \
(strncmp(tmp, FLB_DATADOG_REMAP_PROVIDER, strlen(tmp)) == 0);

ctx->uri = flb_sds_create("/api/v2/logs");
if (!ctx->uri) {
flb_plg_error(ctx->ins, "error on uri generation");
Expand All @@ -138,18 +153,44 @@ struct flb_out_datadog *flb_datadog_conf_create(struct flb_output_instance *ins,

/* Get network configuration */
if (!ins->host.name) {
tmp_sds = flb_sds_create(FLB_DATADOG_DEFAULT_HOST);
/* No explicit Host parameter, check for site */
if (ctx->site) {
flb_plg_debug(ctx->ins, "using site for host construction: %s", ctx->site);
/* Construct hostname from site */
tmp_sds = flb_sds_create("http-intake.logs.");
if (!tmp_sds) {
flb_errno();
flb_datadog_conf_destroy(ctx);
return NULL;
}
tmp_sds = flb_sds_cat(tmp_sds, (const char *)ctx->site, flb_sds_len(ctx->site));
ctx->host = tmp_sds;
flb_plg_debug(ctx->ins, "host constructed from site: %s", ctx->host);
} else {
flb_plg_debug(ctx->ins, "no site specified, using default host");
/* No site specified, use default */
tmp_sds = flb_sds_create(FLB_DATADOG_DEFAULT_HOST);
if (!tmp_sds) {
flb_errno();
flb_datadog_conf_destroy(ctx);
return NULL;
}
ctx->host = tmp_sds;
flb_plg_debug(ctx->ins, "host: %s", ctx->host);
}
}
else {
flb_plg_debug(ctx->ins, "explicit Host parameter takes precedence: %s", ins->host.name);
/* Explicit Host parameter takes precedence */
tmp_sds = flb_sds_create(ins->host.name);
if (!tmp_sds) {
flb_errno();
flb_datadog_conf_destroy(ctx);
return NULL;
}
ctx->host = tmp_sds;
flb_plg_debug(ctx->ins, "host: %s", ctx->host);
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Host construction logic is well-structured but missing error check.

The implementation correctly handles the precedence between explicit host configuration and site-based construction. The debug logging provides excellent traceability. However, there's a missing error check:

-            tmp_sds = flb_sds_cat(tmp_sds, (const char *)ctx->site, flb_sds_len(ctx->site));
-            ctx->host = tmp_sds;
+            tmp_sds = flb_sds_cat(tmp_sds, (const char *)ctx->site, flb_sds_len(ctx->site));
+            if (!tmp_sds) {
+                flb_errno();
+                flb_datadog_conf_destroy(ctx);
+                return NULL;
+            }
+            ctx->host = tmp_sds;

This ensures memory allocation failures in flb_sds_cat are properly handled, consistent with other error handling in this function.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
if (!ins->host.name) {
tmp_sds = flb_sds_create(FLB_DATADOG_DEFAULT_HOST);
/* No explicit Host parameter, check for site */
if (ctx->site) {
flb_plg_debug(ctx->ins, "using site for host construction: %s", ctx->site);
/* Construct hostname from site */
tmp_sds = flb_sds_create("http-intake.logs.");
if (!tmp_sds) {
flb_errno();
flb_datadog_conf_destroy(ctx);
return NULL;
}
tmp_sds = flb_sds_cat(tmp_sds, (const char *)ctx->site, flb_sds_len(ctx->site));
ctx->host = tmp_sds;
flb_plg_debug(ctx->ins, "host constructed from site: %s", ctx->host);
} else {
flb_plg_debug(ctx->ins, "no site specified, using default host");
/* No site specified, use default */
tmp_sds = flb_sds_create(FLB_DATADOG_DEFAULT_HOST);
if (!tmp_sds) {
flb_errno();
flb_datadog_conf_destroy(ctx);
return NULL;
}
ctx->host = tmp_sds;
flb_plg_debug(ctx->ins, "host: %s", ctx->host);
}
}
else {
flb_plg_debug(ctx->ins, "explicit Host parameter takes precedence: %s", ins->host.name);
/* Explicit Host parameter takes precedence */
tmp_sds = flb_sds_create(ins->host.name);
if (!tmp_sds) {
flb_errno();
flb_datadog_conf_destroy(ctx);
return NULL;
}
ctx->host = tmp_sds;
flb_plg_debug(ctx->ins, "host: %s", ctx->host);
}
if (!ins->host.name) {
/* No explicit Host parameter, check for site */
if (ctx->site) {
flb_plg_debug(ctx->ins, "using site for host construction: %s", ctx->site);
/* Construct hostname from site */
tmp_sds = flb_sds_create("http-intake.logs.");
if (!tmp_sds) {
flb_errno();
flb_datadog_conf_destroy(ctx);
return NULL;
}
tmp_sds = flb_sds_cat(tmp_sds, (const char *)ctx->site, flb_sds_len(ctx->site));
if (!tmp_sds) {
flb_errno();
flb_datadog_conf_destroy(ctx);
return NULL;
}
ctx->host = tmp_sds;
flb_plg_debug(ctx->ins, "host constructed from site: %s", ctx->host);
} else {
flb_plg_debug(ctx->ins, "no site specified, using default host");
/* No site specified, use default */
tmp_sds = flb_sds_create(FLB_DATADOG_DEFAULT_HOST);
if (!tmp_sds) {
flb_errno();
flb_datadog_conf_destroy(ctx);
return NULL;
}
ctx->host = tmp_sds;
flb_plg_debug(ctx->ins, "host: %s", ctx->host);
}
}
else {
flb_plg_debug(ctx->ins, "explicit Host parameter takes precedence: %s", ins->host.name);
/* Explicit Host parameter takes precedence */
tmp_sds = flb_sds_create(ins->host.name);
if (!tmp_sds) {
flb_errno();
flb_datadog_conf_destroy(ctx);
return NULL;
}
ctx->host = tmp_sds;
flb_plg_debug(ctx->ins, "host: %s", ctx->host);
}
🤖 Prompt for AI Agents
In plugins/out_datadog/datadog_conf.c between lines 155 and 193, the code
correctly constructs the host string but lacks error checking after the
flb_sds_cat call that appends ctx->site to tmp_sds. To fix this, add a check to
verify that flb_sds_cat did not return NULL, indicating a memory allocation
failure. If it returns NULL, call flb_errno(), clean up by calling
flb_datadog_conf_destroy(ctx), and return NULL to handle the error consistently
with the rest of the function.

if (!tmp_sds) {
flb_errno();
flb_datadog_conf_destroy(ctx);
return NULL;
}
ctx->host = tmp_sds;
flb_plg_debug(ctx->ins, "host: %s", ctx->host);

if (ins->host.port != 0) {
ctx->port = ins->host.port;
Expand Down Expand Up @@ -222,6 +263,9 @@ int flb_datadog_conf_destroy(struct flb_out_datadog *ctx)
if (ctx->upstream) {
flb_upstream_destroy(ctx->upstream);
}
if (ctx->site){
flb_sds_destroy(ctx->site);
}
flb_free(ctx);

return 0;
Expand Down
Loading