diff options
Diffstat (limited to 'src/fluent-bit/plugins/out_oracle_log_analytics/oci_logan.c')
-rw-r--r-- | src/fluent-bit/plugins/out_oracle_log_analytics/oci_logan.c | 1313 |
1 files changed, 0 insertions, 1313 deletions
diff --git a/src/fluent-bit/plugins/out_oracle_log_analytics/oci_logan.c b/src/fluent-bit/plugins/out_oracle_log_analytics/oci_logan.c deleted file mode 100644 index 630812e2d..000000000 --- a/src/fluent-bit/plugins/out_oracle_log_analytics/oci_logan.c +++ /dev/null @@ -1,1313 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ - -/* Fluent Bit - * ========== - * Copyright (C) 2015-2023 The Fluent Bit Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -#include <fluent-bit/flb_output_plugin.h> -#include <fluent-bit/flb_upstream.h> -#include <fluent-bit/flb_upstream_conn.h> -#include <fluent-bit/flb_http_client.h> -#include <fluent-bit/flb_log_event_decoder.h> -#include <fluent-bit/flb_hash_table.h> -#include <fluent-bit/flb_pack.h> -#include <fluent-bit/flb_crypto.h> -#include <fluent-bit/flb_base64.h> -#include <fluent-bit/flb_hash.h> -#include <fluent-bit/flb_sds.h> - -#include <monkey/mk_core/mk_list.h> -#include <msgpack.h> - -#include <string.h> - -#include "oci_logan_conf.h" -#include "oci_logan.h" - - -static int check_config_from_record(msgpack_object key, - char *name, int len) -{ - if (key.type != MSGPACK_OBJECT_STR) { - return FLB_FALSE; - } - - if (key.via.str.size != len) { - return FLB_FALSE; - } - - - return memcmp(key.via.str.ptr, name, len) == 0; -} - -/* - * Authorization: Signature version="1",keyId="<tenancy_ocid>/<user_ocid>/<key_fingerprint>", - * algorithm="rsa-sha256",headers="(request-target) date x-content-sha256 content-type content-length", - * signature="signature" - */ -static flb_sds_t create_authorization_header_content(struct flb_oci_logan *ctx, - flb_sds_t signature) -{ - flb_sds_t content; - - content = flb_sds_create_size(512); - flb_sds_cat_safe(&content, FLB_OCI_SIGN_SIGNATURE_VERSION, - sizeof(FLB_OCI_SIGN_SIGNATURE_VERSION) - 1); - flb_sds_cat_safe(&content, ",", 1); - flb_sds_cat_safe(&content, FLB_OCI_SIGN_KEYID, - sizeof(FLB_OCI_SIGN_KEYID) - 1); - flb_sds_cat_safe(&content, "=\"", 2); - flb_sds_cat_safe(&content, ctx->key_id, flb_sds_len(ctx->key_id)); - flb_sds_cat_safe(&content, "\",", 2); - flb_sds_cat_safe(&content, FLB_OCI_SIGN_ALGORITHM, - sizeof(FLB_OCI_SIGN_ALGORITHM) - 1); - flb_sds_cat_safe(&content, ",", 1); - flb_sds_cat_safe(&content, FLB_OCI_SIGN_HEADERS, - sizeof(FLB_OCI_SIGN_HEADERS) - 1); - flb_sds_cat_safe(&content, ",", 1); - flb_sds_cat_safe(&content, FLB_OCI_SIGN_SIGNATURE, - sizeof(FLB_OCI_SIGN_SIGNATURE) - 1); - flb_sds_cat_safe(&content, "=\"", 2); - flb_sds_cat_safe(&content, signature, flb_sds_len(signature)); - flb_sds_cat_safe(&content, "\"", 1); - - return content; -} - -static flb_sds_t create_base64_sha256_signature(struct flb_oci_logan *ctx, - flb_sds_t signing_string) -{ - int len = 0, ret; - size_t outlen; - flb_sds_t signature; - unsigned char sha256_buf[32] = { 0 }; - unsigned char sig[256] = { 0 }; - size_t sig_len = sizeof(sig); - - ret = flb_hash_simple(FLB_HASH_SHA256, - (unsigned char*) signing_string, - flb_sds_len(signing_string), - sha256_buf, sizeof(sha256_buf)); - - if(ret != FLB_CRYPTO_SUCCESS) { - flb_plg_error(ctx->ins, "error generating hash buffer"); - return NULL; - } - - ret = flb_crypto_sign_simple(FLB_CRYPTO_PRIVATE_KEY, - FLB_CRYPTO_PADDING_PKCS1, - FLB_HASH_SHA256, - (unsigned char *) ctx->private_key, - flb_sds_len(ctx->private_key), - sha256_buf, sizeof(sha256_buf), - sig, &sig_len); - - - if (ret != FLB_CRYPTO_SUCCESS) { - flb_plg_error(ctx->ins, "error signing SHA256"); - return NULL; - } - - signature = flb_sds_create_size(512); - if (!signature) { - flb_errno(); - return NULL; - } - - /* base 64 encode */ - len = flb_sds_alloc(signature) - 1; - flb_base64_encode((unsigned char*) signature, len, &outlen, sig, - sizeof(sig)); - signature[outlen] = '\0'; - flb_sds_len_set(signature, outlen); - - return signature; -} - -static flb_sds_t get_date(void) -{ - - flb_sds_t rfc1123date; - time_t t; - size_t size; - struct tm tm = { 0 }; - - /* Format Date */ - rfc1123date = flb_sds_create_size(32); - if (!rfc1123date) { - flb_errno(); - return NULL; - } - - t = time(NULL); - if (!gmtime_r(&t, &tm)) { - flb_errno(); - flb_sds_destroy(rfc1123date); - return NULL; - } - size = strftime(rfc1123date, flb_sds_alloc(rfc1123date) - 1, - "%a, %d %b %Y %H:%M:%S GMT", &tm); - if (size <= 0) { - flb_errno(); - flb_sds_destroy(rfc1123date); - return NULL; - } - flb_sds_len_set(rfc1123date, size); - return rfc1123date; -} - -static flb_sds_t add_header_and_signing(struct flb_http_client *c, - flb_sds_t signing_str, const char *header, int headersize, - const char *val, int val_size) -{ - if (!signing_str) { - return NULL; - } - - flb_http_add_header(c, header, headersize, val, val_size); - - flb_sds_cat_safe(&signing_str, "\n", 1); - flb_sds_cat_safe(&signing_str, header, headersize); - flb_sds_cat_safe(&signing_str, ": ", 2); - flb_sds_cat_safe(&signing_str, val, val_size); - - return signing_str; -} - -static int build_headers(struct flb_http_client *c, struct flb_oci_logan *ctx, - flb_sds_t json, flb_sds_t hostname, int port, flb_sds_t uri) -{ - int ret = -1; - flb_sds_t tmp_sds = NULL; - flb_sds_t signing_str = NULL; - flb_sds_t rfc1123date = NULL; - flb_sds_t encoded_uri = NULL; - flb_sds_t signature = NULL; - flb_sds_t auth_header_str = NULL; - - flb_sds_t tmp_ref = NULL; - - size_t tmp_len = 0; - - unsigned char sha256_buf[32] = { 0 }; - - tmp_sds = flb_sds_create_size(512); - if (!tmp_sds) { - flb_errno(); - goto error_label; - } - - signing_str = flb_sds_create_size(1024); - if (!signing_str) { - flb_errno(); - goto error_label; - } - - /* Add (requeset-target) to signing string */ - encoded_uri = flb_uri_encode(uri, flb_sds_len(uri)); - if (!encoded_uri) { - flb_errno(); - goto error_label; - } - flb_sds_cat_safe(&signing_str, FLB_OCI_HEADER_REQUEST_TARGET, - sizeof(FLB_OCI_HEADER_REQUEST_TARGET) - 1); - flb_sds_cat_safe(&signing_str, ": post ", sizeof(": post ") - 1); - flb_sds_cat_safe(&signing_str, encoded_uri, - flb_sds_len(encoded_uri)); - - /* Add Host to Header */ - if (((c->flags & FLB_IO_TLS) && c->port == 443) - || (!(c->flags & FLB_IO_TLS) && c->port == 80)) { - /* default port */ - tmp_ref = flb_sds_copy(tmp_sds, c->host, strlen(c->host)); - } - else { - tmp_ref = flb_sds_printf(&tmp_sds, "%s:%i", c->host, c->port); - } - if (!tmp_ref) { - flb_plg_error(ctx->ins, "cannot compose temporary host header"); - goto error_label; - } - tmp_sds = tmp_ref; - tmp_ref = NULL; - - signing_str = add_header_and_signing(c, signing_str, FLB_OCI_HEADER_HOST, - sizeof(FLB_OCI_HEADER_HOST) - 1, - tmp_sds, flb_sds_len(tmp_sds)); - if (!signing_str) { - flb_plg_error(ctx->ins, "cannot compose signing string"); - goto error_label; - } - - /* Add Date header */ - rfc1123date = get_date(); - if (!rfc1123date) { - flb_plg_error(ctx->ins, "cannot compose temporary date header"); - goto error_label; - } - signing_str = add_header_and_signing(c, signing_str, FLB_OCI_HEADER_DATE, - sizeof(FLB_OCI_HEADER_DATE) - 1, rfc1123date, - flb_sds_len(rfc1123date)); - if (!signing_str) { - flb_plg_error(ctx->ins, "cannot compose signing string"); - goto error_label; - } - - /* Add x-content-sha256 Header */ - ret = flb_hash_simple(FLB_HASH_SHA256, - (unsigned char*) json, - flb_sds_len(json), - sha256_buf, sizeof(sha256_buf)); - - if (ret != FLB_CRYPTO_SUCCESS) { - flb_plg_error(ctx->ins, "error forming hash buffer for x-content-sha256 Header"); - goto error_label; - } - - flb_base64_encode((unsigned char*) tmp_sds, flb_sds_len(tmp_sds) - 1, - &tmp_len, sha256_buf, sizeof(sha256_buf)); - - tmp_sds[tmp_len] = '\0'; - flb_sds_len_set(tmp_sds, tmp_len); - - signing_str = add_header_and_signing(c, signing_str, - FLB_OCI_HEADER_X_CONTENT_SHA256, - sizeof(FLB_OCI_HEADER_X_CONTENT_SHA256) - 1, tmp_sds, - flb_sds_len(tmp_sds)); - if (!signing_str) { - flb_plg_error(ctx->ins, "cannot compose signing string"); - goto error_label; - } - - /* Add content-Type */ - signing_str = add_header_and_signing(c, signing_str, - FLB_OCI_HEADER_CONTENT_TYPE, sizeof(FLB_OCI_HEADER_CONTENT_TYPE) - 1, - FLB_OCI_HEADER_CONTENT_TYPE_VAL, - sizeof(FLB_OCI_HEADER_CONTENT_TYPE_VAL) - 1); - if (!signing_str) { - flb_plg_error(ctx->ins, "cannot compose signing string"); - goto error_label; - } - - /* Add content-Length */ - tmp_len = snprintf(tmp_sds, flb_sds_alloc(tmp_sds) - 1, "%i", - (int) flb_sds_len(json)); - flb_sds_len_set(tmp_sds, tmp_len); - signing_str = add_header_and_signing(c, signing_str, - FLB_OCI_HEADER_CONTENT_LENGTH, sizeof(FLB_OCI_HEADER_CONTENT_LENGTH) - 1, - tmp_sds, flb_sds_len(tmp_sds)); - if (!signing_str) { - flb_plg_error(ctx->ins, "cannot compose signing string"); - goto error_label; - } - - /* Add Authorization header */ - signature = create_base64_sha256_signature(ctx, signing_str); - if (!signature) { - flb_plg_error(ctx->ins, "cannot compose signing signature"); - goto error_label; - } - - auth_header_str = create_authorization_header_content(ctx, signature); - if (!auth_header_str) { - flb_plg_error(ctx->ins, "cannot compose authorization header"); - goto error_label; - } - - flb_http_add_header(c, FLB_OCI_HEADER_AUTH, sizeof(FLB_OCI_HEADER_AUTH) - 1, - auth_header_str, flb_sds_len(auth_header_str)); - - /* User-Agent */ - flb_http_add_header(c, FLB_OCI_HEADER_USER_AGENT, - sizeof(FLB_OCI_HEADER_USER_AGENT) - 1, - FLB_OCI_HEADER_USER_AGENT_VAL, - sizeof(FLB_OCI_HEADER_USER_AGENT_VAL) - 1); - - /* Accept */ - flb_http_add_header(c, "Accept", 6, "*/*", 3); - - ret = 0; - - error_label: - if (tmp_sds) { - flb_sds_destroy(tmp_sds); - } - if (signing_str) { - flb_sds_destroy(signing_str); - } - if (rfc1123date) { - flb_sds_destroy(rfc1123date); - } - if (encoded_uri) { - flb_sds_destroy(encoded_uri); - } - if (signature) { - flb_sds_destroy(signature); - } - if (auth_header_str) { - flb_sds_destroy(auth_header_str); - } - return ret; -} - -static struct flb_oci_error_response* parse_response_error(struct flb_oci_logan *ctx, - char *response, size_t response_len) -{ - int tok_size = 32, ret, i; - jsmn_parser parser; - jsmntok_t *t; - jsmntok_t *tokens; - char *key; - char *val; - int key_len; - int val_len; - struct flb_oci_error_response *error_response; - - jsmn_init(&parser); - - tokens = flb_calloc(1, sizeof(jsmntok_t) * tok_size); - if (!tokens) { - flb_errno(); - return NULL; - } - - ret = jsmn_parse(&parser, response, response_len, tokens, tok_size); - - if (ret == JSMN_ERROR_INVAL || ret == JSMN_ERROR_PART) { - flb_free(tokens); - flb_plg_info(ctx->ins, - "Unable to parser error response. reponse is not valid json"); - return NULL; - } - tok_size = ret; - - error_response = flb_calloc(1, sizeof(struct flb_oci_error_response)); - if (!error_response) { - flb_errno(); - flb_free(tokens); - return NULL; - } - - /* Parse JSON tokens */ - for (i = 0; i < tok_size; i++) { - t = &tokens[i]; - - if (t->start == -1 || t->end == -1 || (t->start == 0 && t->end == 0)) { - break; - } - - if (t->type != JSMN_STRING) { - continue; - } - - key = response + t->start; - key_len = (t->end - t->start); - - i++; - t = &tokens[i]; - val = response + t->start; - val_len = (t->end - t->start); - - if (val_len < 1) { - continue; - } - - if ((key_len == sizeof(FLB_OCI_ERROR_RESPONSE_CODE) - 1) - && strncasecmp(key, FLB_OCI_ERROR_RESPONSE_CODE, - sizeof(FLB_OCI_ERROR_RESPONSE_CODE) - 1) == 0) { - /* code */ - error_response->code = flb_sds_create_len(val, val_len); - if (!error_response->code) { - flb_free(error_response); - flb_free(tokens); - return NULL; - } - } - else if ((key_len == sizeof(FLB_OCI_ERROR_RESPONSE_MESSAGE) - 1) - && strncasecmp(key, FLB_OCI_ERROR_RESPONSE_MESSAGE, - sizeof(FLB_OCI_ERROR_RESPONSE_MESSAGE) - 1) == 0) { - - /* message */ - error_response->message = flb_sds_create_len(val, val_len); - if (!error_response->message) { - flb_free(error_response); - flb_free(tokens); - return NULL; - } - } - } - - flb_free(tokens); - return error_response; -} - -static int retry_error(struct flb_http_client *c, struct flb_oci_logan *ctx) -{ - struct flb_oci_error_response *error_response = NULL; - int tmp_len; - int ret = FLB_FALSE; - - /* possible retry error message */ - if ( !(c->resp.status == 400 || c->resp.status == 401 - || c->resp.status == 404 || c->resp.status == 409 - || c->resp.status == 429 || c->resp.status == 500)) { - return FLB_FALSE; - } - - /* parse error message */ - error_response = parse_response_error(ctx, c->resp.payload, - c->resp.payload_size); - if (!error_response) { - return FLB_FALSE; - } - - if (error_response->code) { - tmp_len = flb_sds_len(error_response->code); - if (c->resp.status == 400 - && (tmp_len == sizeof(FLB_OCI_ERROR_CODE_RELATED_RESOURCE_NOT_FOUND) - 1) - && strncasecmp(error_response->code, FLB_OCI_ERROR_CODE_RELATED_RESOURCE_NOT_FOUND, tmp_len) == 0) { - ret = FLB_TRUE; - } - else if( c->resp.status == 401 - &&( tmp_len == sizeof(FLB_OCI_ERROR_CODE_NOT_AUTHENTICATED)-1 ) - && strncasecmp(error_response->code, FLB_OCI_ERROR_CODE_NOT_AUTHENTICATED, tmp_len) == 0) { - ret = FLB_TRUE; - } - else if (c->resp.status == 404 - && (tmp_len == sizeof(FLB_OCI_ERROR_CODE_NOT_AUTHENTICATEDORNOTFOUND) - 1) - && strncasecmp(error_response->code, FLB_OCI_ERROR_CODE_NOT_AUTHENTICATEDORNOTFOUND, tmp_len) == 0) { - ret = FLB_TRUE; - } - else if (c->resp.status == 409 - && (tmp_len == sizeof(FLB_OCI_ERROR_CODE_INCORRECTSTATE) - 1) - && strncasecmp(error_response->code, FLB_OCI_ERROR_CODE_INCORRECTSTATE, tmp_len) == 0) { - ret = FLB_TRUE; - } - else if (c->resp.status == 409 - && (tmp_len == sizeof(FLB_OCI_ERROR_CODE_NOT_AUTH_OR_RESOURCE_EXIST) - 1) - && strncasecmp(error_response->code, FLB_OCI_ERROR_CODE_NOT_AUTH_OR_RESOURCE_EXIST, tmp_len) == 0) { - ret = FLB_TRUE; - } - else if (c->resp.status == 429 - && (tmp_len == sizeof(FLB_OCI_ERROR_CODE_TOO_MANY_REQUESTS) - 1) - && strncasecmp(error_response->code, FLB_OCI_ERROR_CODE_TOO_MANY_REQUESTS, tmp_len) == 0) { - ret = FLB_TRUE; - } - else if (c->resp.status == 500 - && (tmp_len == sizeof(FLB_OCI_ERROR_CODE_INTERNAL_SERVER_ERROR) - 1) - && strncasecmp(error_response->code, FLB_OCI_ERROR_CODE_INTERNAL_SERVER_ERROR, tmp_len) == 0) { - ret = FLB_TRUE; - } - } - - if (error_response->code) { - flb_sds_destroy(error_response->code); - } - if (error_response->message) { - flb_sds_destroy(error_response->message); - } - flb_free(error_response); - - return ret; -} - -static int cb_oci_logan_init(struct flb_output_instance *ins, - struct flb_config *config, - void *data) -{ - struct flb_oci_logan *ctx; - ctx = flb_oci_logan_conf_create(ins, config); - if (!ctx) { - flb_plg_error(ins, "cannot initialize plugin"); - return -1; - } - flb_plg_info(ins, "initialized logan plugin"); - flb_output_set_context(ins, ctx); - flb_output_set_http_debug_callbacks(ins); - - return 0; -} - -static flb_sds_t compose_uri(struct flb_oci_logan *ctx, - flb_sds_t log_set, flb_sds_t log_group_id) -{ - flb_sds_t uri_param; - flb_sds_t full_uri; - - uri_param = flb_sds_create_size(512); - if (!uri_param) { - flb_errno(); - return NULL; - } - - /* LogGroupId */ - if (log_group_id) { - if (flb_sds_len(uri_param) > 0) { - flb_sds_cat_safe(&uri_param, "&", 1); - } - flb_sds_cat_safe(&uri_param, FLB_OCI_LOG_GROUP_ID, - FLB_OCI_LOG_GROUP_ID_SIZE); - flb_sds_cat_safe(&uri_param, "=", 1); - flb_sds_cat_safe(&uri_param, log_group_id, - flb_sds_len(log_group_id)); - } - - if (!uri_param) { - return NULL; - } - - /* logSet */ - if (log_set) { - if (flb_sds_len(uri_param) > 0) { - flb_sds_cat_safe(&uri_param, "&", 1); - } - flb_sds_cat_safe(&uri_param, FLB_OCI_LOG_SET, - FLB_OCI_LOG_SET_SIZE); - flb_sds_cat_safe(&uri_param, "=", 1); - flb_sds_cat_safe(&uri_param, log_set, - flb_sds_len(log_set)); - } - - if (!uri_param) { - return NULL; - } - - flb_sds_cat_safe(&uri_param, "&", 1); - flb_sds_cat_safe(&uri_param, FLB_OCI_PAYLOAD_TYPE, - sizeof(FLB_OCI_PAYLOAD_TYPE) - 1); - flb_sds_cat_safe(&uri_param, "=", 1); - flb_sds_cat_safe(&uri_param, "JSON", 4); - - - if (!uri_param) { - return NULL; - } - - - if (flb_sds_len(uri_param) == 0) { - flb_sds_destroy(uri_param); - return flb_sds_create(ctx->uri); - } - - full_uri = flb_sds_create_size( - flb_sds_len(ctx->uri) + 1 + flb_sds_len(uri_param)); - if (!full_uri) { - flb_errno(); - flb_sds_destroy(uri_param); - return NULL; - } - - flb_sds_cat_safe(&full_uri, ctx->uri, flb_sds_len(ctx->uri)); - flb_sds_cat_safe(&full_uri, "?", 1); - flb_sds_cat_safe(&full_uri, uri_param, flb_sds_len(uri_param)); - - flb_sds_destroy(uri_param); - - return full_uri; -} - -static int flush_to_endpoint(struct flb_oci_logan *ctx, - flb_sds_t payload, - flb_sds_t log_group_id, - flb_sds_t log_set_id) -{ - int out_ret = FLB_RETRY; - int http_ret; - size_t b_sent; - flb_sds_t full_uri; - struct flb_http_client *c = NULL; - struct flb_connection *u_conn; - - full_uri = compose_uri(ctx, log_set_id, log_group_id); - if(!full_uri) { - flb_plg_error(ctx->ins, "unable to compose uri for logGroup: %s logSet: %s", - ctx->oci_la_log_group_id, ctx->oci_la_log_set_id); - } - - flb_plg_debug(ctx->ins, "full_uri=%s", full_uri); - - u_conn = flb_upstream_conn_get(ctx->u); - if(!u_conn) { - goto error_label; - } - /* Create HTTP client context */ - c = flb_http_client(u_conn, FLB_HTTP_POST, full_uri, (void*) payload, - flb_sds_len(payload), ctx->ins->host.name, ctx->ins->host.port, ctx->proxy, 0); - if (!c) { - goto error_label; - } - flb_http_allow_duplicated_headers(c, FLB_FALSE); - - flb_plg_debug(ctx->ins, "built client"); - flb_http_buffer_size(c, FLB_HTTP_DATA_SIZE_MAX); - if (build_headers(c, ctx, payload, ctx->ins->host.name, ctx->ins->host.port, full_uri) < 0) { - flb_plg_error(ctx->ins, "failed to build headers"); - goto error_label; - } - flb_plg_debug(ctx->ins, "built request"); - - out_ret = FLB_OK; - - http_ret = flb_http_do(c, &b_sent); - flb_plg_debug(ctx->ins, "placed request"); - - if (http_ret == 0) { - - if (c->resp.status != 200) { - flb_plg_debug(ctx->ins, "request header %s", c->header_buf); - - out_ret = FLB_ERROR; - - if (c->resp.payload && c->resp.payload_size > 0) { - if (retry_error(c, ctx) == FLB_TRUE) { - out_ret = FLB_RETRY; - } - - flb_plg_error(ctx->ins, "%s:%i, retry=%s, HTTP status=%i\n%s", - ctx->ins->host.name, ctx->ins->host.port, - (out_ret == FLB_RETRY ? "true" : "false"), - c->resp.status, c->resp.payload); - } - else { - flb_plg_error(ctx->ins, "%s:%i, retry=%s, HTTP status=%i", - ctx->ins->host.name, ctx->ins->host.port, - (out_ret == FLB_RETRY ? "true" : "false"), - c->resp.status); - } - } - } - else { - out_ret = FLB_RETRY; - flb_plg_error(ctx->ins, "could not flush records to %s:%i (http_do=%i), retry=%s", - ctx->ins->host.name, ctx->ins->host.port, - http_ret, (out_ret == FLB_RETRY ? "true" : "false")); - goto error_label; - } - - - - error_label: - if (full_uri) { - flb_sds_destroy(full_uri); - } - - /* Destroy HTTP client context */ - if (c) { - flb_http_client_destroy(c); - } - - /* Release the TCP connection */ - if (u_conn) { - flb_upstream_conn_release(u_conn); - } - - return out_ret; - -} - -static void pack_oci_fields(msgpack_packer *packer, - struct flb_oci_logan *ctx) -{ - int num_global_meta = 0; - int num_event_meta = 0; - int pck_sz = 2; - struct mk_list *head = NULL; - struct metadata_obj *f; - - - /* number of meta properties */ - if(ctx->oci_la_global_metadata != NULL) { - num_global_meta = mk_list_size(&ctx->global_metadata_fields); - } - if(ctx->oci_la_metadata != NULL) { - num_event_meta = mk_list_size(&ctx->log_event_metadata_fields); - } - - - if (num_global_meta > 0) { - msgpack_pack_map(packer, 2); - msgpack_pack_str(packer, FLB_OCI_LOG_METADATA_SIZE); - msgpack_pack_str_body(packer, FLB_OCI_LOG_METADATA, - FLB_OCI_LOG_METADATA_SIZE); - - msgpack_pack_map(packer, num_global_meta); - /* pack kv list */ - mk_list_foreach(head, &ctx->global_metadata_fields) { - f = mk_list_entry(head, struct metadata_obj, _head); - - msgpack_pack_str(packer, flb_sds_len(f->key)); - msgpack_pack_str_body(packer, f->key, flb_sds_len(f->key)); - - msgpack_pack_str(packer, flb_sds_len(f->val)); - msgpack_pack_str_body(packer, f->val, flb_sds_len(f->val)); - - } - - } - else { - msgpack_pack_map(packer, 1); - } - - /* - *logEvents":[ - { - "entityId":"", - "logSourceName":"LinuxSyslogSource", - "logPath":"/var/log/messages", - "metadata":{ - "Error ID":"1", - "Environment":"prod", - "Client Host Region":"PST" - }, - "logRecords":[ - "May 8 2017 04:02:36 blr00akm syslogd 1.4.1: shutdown.", - "May 8 2017 04:02:37 blr00akm syslogd 1.4.1: restart." - ] - }, - { - - } - ] - */ - msgpack_pack_str(packer, FLB_OCI_LOG_EVENTS_SIZE); - msgpack_pack_str_body(packer, FLB_OCI_LOG_EVENTS, FLB_OCI_LOG_EVENTS_SIZE); - - msgpack_pack_array(packer, 1); - - if (ctx->oci_la_entity_id) { - pck_sz++; - } - if (ctx->oci_la_log_path) { - pck_sz++; - } - if (ctx->oci_la_entity_type) { - pck_sz++; - } - - if (num_event_meta > 0) { - pck_sz++; - } - - msgpack_pack_map(packer, pck_sz); /* entityId, logSourceName, logPath, logRecords */ - - - /* "entityType:"" */ - if (ctx->oci_la_entity_type) { - msgpack_pack_str(packer, FLB_OCI_ENTITY_TYPE_SIZE); - msgpack_pack_str_body(packer, FLB_OCI_ENTITY_TYPE, FLB_OCI_ENTITY_TYPE_SIZE); - msgpack_pack_str(packer, flb_sds_len(ctx->oci_la_entity_type)); - msgpack_pack_str_body(packer, ctx->oci_la_entity_type, - flb_sds_len(ctx->oci_la_entity_type)); - } - - /* "entityId":"", */ - if (ctx->oci_la_entity_id) { - msgpack_pack_str(packer, FLB_OCI_ENTITY_ID_SIZE); - msgpack_pack_str_body(packer, FLB_OCI_ENTITY_ID, FLB_OCI_ENTITY_ID_SIZE); - msgpack_pack_str(packer, flb_sds_len(ctx->oci_la_entity_id)); - msgpack_pack_str_body(packer, ctx->oci_la_entity_id, - flb_sds_len(ctx->oci_la_entity_id)); - } - - - /* "logSourceName":"", */ - msgpack_pack_str(packer, FLB_OCI_LOG_SOURCE_NAME_SIZE); - msgpack_pack_str_body(packer, FLB_OCI_LOG_SOURCE_NAME, - FLB_OCI_LOG_SOURCE_NAME_SIZE); - msgpack_pack_str(packer, flb_sds_len(ctx->oci_la_log_source_name)); - msgpack_pack_str_body(packer, ctx->oci_la_log_source_name, - flb_sds_len(ctx->oci_la_log_source_name)); - - - /* "logPath":"" */ - if (ctx->oci_la_log_path) { - msgpack_pack_str(packer, FLB_OCI_LOG_PATH_SIZE); - msgpack_pack_str_body(packer, FLB_OCI_LOG_PATH, FLB_OCI_LOG_PATH_SIZE); - msgpack_pack_str(packer, flb_sds_len(ctx->oci_la_log_path)); - msgpack_pack_str_body(packer, ctx->oci_la_log_path, - flb_sds_len(ctx->oci_la_log_path)); - } - - - /* Add metadata */ - if (num_event_meta > 0) { - /* - "metadata":{ - "Error ID":"0", - "Environment":"dev", - "Client Host Region":"IST" - }, - */ - msgpack_pack_str(packer, FLB_OCI_LOG_METADATA_SIZE); - msgpack_pack_str_body(packer, FLB_OCI_LOG_METADATA, - FLB_OCI_LOG_METADATA_SIZE); - - msgpack_pack_map(packer, num_event_meta); - /* pack kv list */ - mk_list_foreach(head, &ctx->log_event_metadata_fields) { - f = mk_list_entry(head, struct metadata_obj, _head); - - msgpack_pack_str(packer, flb_sds_len(f->key)); - msgpack_pack_str_body(packer, f->key, flb_sds_len(f->key)); - - msgpack_pack_str(packer, flb_sds_len(f->val)); - msgpack_pack_str_body(packer, f->val, flb_sds_len(f->val)); - - } - - } -} - -static int get_and_pack_oci_fields_from_record(msgpack_packer *packer, - msgpack_object map, - flb_sds_t *lg_id, - flb_sds_t *ls_id, - struct flb_oci_logan *ctx) -{ - int map_size = map.via.map.size; - int pck_size = 1, i; - msgpack_object *log_group_id= NULL; - msgpack_object *log_set_id = NULL; - msgpack_object *entity_id = NULL; - msgpack_object *entity_type = NULL; - msgpack_object *log_path = NULL; - msgpack_object *log_source = NULL; - msgpack_object *global_metadata = NULL; - msgpack_object *metadata = NULL; - - for(i = 0; i < map_size; i++) { - if (check_config_from_record(map.via.map.ptr[i].key, - FLB_OCI_LOG_GROUP_ID_KEY, - FLB_OCI_LOG_GROUP_ID_KEY_SIZE) == FLB_TRUE) { - if (map.via.map.ptr[i].val.type == MSGPACK_OBJECT_STR) { - log_group_id = &map.via.map.ptr[i].val; - } - continue; - } - else if (check_config_from_record(map.via.map.ptr[i].key, - FLB_OCI_LOG_SET_ID_KEY, - FLB_OCI_LOG_SET_ID_KEY_SIZE) == FLB_TRUE) { - if (map.via.map.ptr[i].val.type == MSGPACK_OBJECT_STR) { - log_set_id = &map.via.map.ptr[i].val; - } - continue; - } - else if (check_config_from_record(map.via.map.ptr[i].key, - FLB_OCI_LOG_ENTITY_ID_KEY, - FLB_OCI_LOG_ENTITY_ID_KEY_SIZE) == FLB_TRUE) { - if (map.via.map.ptr[i].val.type == MSGPACK_OBJECT_STR) { - entity_id = &map.via.map.ptr[i].val; - pck_size++; - } - continue; - } - else if (check_config_from_record(map.via.map.ptr[i].key, - FLB_OCI_LOG_ENTITY_TYPE_KEY, - FLB_OCI_LOG_ENTITY_TYPE_KEY_SIZE) == FLB_TRUE) { - if (map.via.map.ptr[i].val.type == MSGPACK_OBJECT_STR) { - entity_type = &map.via.map.ptr[i].val; - pck_size++; - } - continue; - } - else if (check_config_from_record(map.via.map.ptr[i].key, - FLB_OCI_LOG_SOURCE_NAME_KEY, - FLB_OCI_LOG_SOURCE_NAME_KEY_SIZE) == FLB_TRUE) { - if (map.via.map.ptr[i].val.type == MSGPACK_OBJECT_STR) { - log_source = &map.via.map.ptr[i].val; - pck_size++; - } - continue; - } - else if (check_config_from_record(map.via.map.ptr[i].key, - FLB_OCI_LOG_PATH_KEY, - FLB_OCI_LOG_PATH_KEY_SIZE) == FLB_TRUE) { - if (map.via.map.ptr[i].val.type == MSGPACK_OBJECT_STR) { - log_path = &map.via.map.ptr[i].val; - pck_size++; - } - continue; - } - else if (check_config_from_record(map.via.map.ptr[i].key, - FLB_OCI_METADATA_KEY, - FLB_OCI_METADATA_KEY_SIZE) == FLB_TRUE) { - if (map.via.map.ptr[i].val.type == MSGPACK_OBJECT_STR) { - metadata = &map.via.map.ptr[i].val; - pck_size++; - } - continue; - } - else if (check_config_from_record(map.via.map.ptr[i].key, - FLB_OCI_GLOBAL_METADATA_KEY, - FLB_OCI_GLOBAL_METADATA_KEY_SIZE) == FLB_TRUE) { - if (map.via.map.ptr[i].val.type == MSGPACK_OBJECT_STR) { - global_metadata = &map.via.map.ptr[i].val; - } - continue; - } - } - - if (log_group_id == NULL || log_source == NULL) { - flb_plg_error(ctx->ins, - "log source name and log group id are required"); - return -1; - } - if (global_metadata != NULL) { - msgpack_pack_map(packer, 2); - msgpack_pack_str(packer, FLB_OCI_LOG_METADATA_SIZE); - msgpack_pack_str_body(packer, FLB_OCI_LOG_METADATA, - FLB_OCI_LOG_METADATA_SIZE); - - msgpack_pack_object(packer, *global_metadata); - } - else { - msgpack_pack_map(packer, 1); - } - - /* - *logEvents":[ - { - "entityId":"", - "logSourceName":"LinuxSyslogSource", - "logPath":"/var/log/messages", - "metadata":{ - "Error ID":"1", - "Environment":"prod", - "Client Host Region":"PST" - }, - "logRecords":[ - "May 8 2017 04:02:36 blr00akm syslogd 1.4.1: shutdown.", - "May 8 2017 04:02:37 blr00akm syslogd 1.4.1: restart." - ] - }, - { - - } - ] - */ - msgpack_pack_str(packer, FLB_OCI_LOG_EVENTS_SIZE); - msgpack_pack_str_body(packer, FLB_OCI_LOG_EVENTS, FLB_OCI_LOG_EVENTS_SIZE); - - msgpack_pack_array(packer, 1); - - if (metadata != NULL) { - pck_size++; - msgpack_pack_map(packer, pck_size); /* entityType, entityId, logSourceName, logPath, metadata, logRecords */ - msgpack_pack_str(packer, FLB_OCI_LOG_METADATA_SIZE); - msgpack_pack_str_body(packer, FLB_OCI_LOG_METADATA, - FLB_OCI_LOG_METADATA_SIZE); - msgpack_pack_object(packer, *global_metadata); - - } - else { - msgpack_pack_map(packer, pck_size); /* entityType, entityId, logSourceName, logPath, logRecords */ - } - - /* "entityType:"" */ - if (entity_type) { - msgpack_pack_str(packer, FLB_OCI_ENTITY_TYPE_SIZE); - msgpack_pack_str_body(packer, FLB_OCI_ENTITY_TYPE, FLB_OCI_ENTITY_TYPE_SIZE); - msgpack_pack_object(packer, *entity_type); - } - - /* "entityId":"", */ - if (entity_type) { - msgpack_pack_str(packer, FLB_OCI_ENTITY_ID_SIZE); - msgpack_pack_str_body(packer, FLB_OCI_ENTITY_ID, FLB_OCI_ENTITY_ID_SIZE); - msgpack_pack_object(packer, *entity_id); - } - - - - /* "logSourceName":"", */ - msgpack_pack_str(packer, FLB_OCI_LOG_SOURCE_NAME_SIZE); - msgpack_pack_str_body(packer, FLB_OCI_LOG_SOURCE_NAME, - FLB_OCI_LOG_SOURCE_NAME_SIZE); - msgpack_pack_object(packer, *log_source); - - - /* "logPath":"" */ - if (log_path) { - msgpack_pack_str(packer, FLB_OCI_LOG_PATH_SIZE); - msgpack_pack_str_body(packer, FLB_OCI_LOG_PATH, FLB_OCI_LOG_PATH_SIZE); - msgpack_pack_object(packer, *log_path); - } - - *lg_id = flb_sds_create_len(log_group_id->via.str.ptr, log_group_id->via.str.size); - if(!*lg_id) { - return -1; - } - if (log_set_id != NULL) { - *ls_id = flb_sds_create_len(log_set_id->via.str.ptr, log_set_id->via.str.size); - if(!*ls_id) { - return -1; - } - } - return 0; - -} - -static int total_flush(struct flb_event_chunk *event_chunk, - struct flb_output_flush *out_flush, - struct flb_input_instance *ins, void *out_context, - struct flb_config *config) -{ - struct flb_oci_logan *ctx = out_context; - flb_sds_t out_buf = NULL; - int ret = 0, res = FLB_OK, ret1 = 0, i; - msgpack_object map; - int map_size; - msgpack_sbuffer mp_sbuf; - msgpack_packer mp_pck; - int msg = -1, log = -1; - struct flb_log_event_decoder log_decoder; - struct flb_log_event log_event; - int num_records; - flb_sds_t log_group_id = NULL; - flb_sds_t log_set_id = NULL; - int count = 0; - - ret = flb_log_event_decoder_init(&log_decoder, (char *) event_chunk->data, event_chunk->size); - - if (ret != FLB_EVENT_DECODER_SUCCESS) { - flb_plg_error(ctx->ins, - "Log event decoder initialization error : %d", ret); - res = FLB_ERROR; - goto clean_up; - } - - /* Create temporary msgpack buffer */ - msgpack_sbuffer_init(&mp_sbuf); - msgpack_packer_init(&mp_pck, &mp_sbuf, msgpack_sbuffer_write); - - /* pack oci fields */ - /* pack_oci_fields(&mp_pck, ctx); */ - - num_records = flb_mp_count(event_chunk->data, event_chunk->size); - - while ((ret = flb_log_event_decoder_next( - &log_decoder, - &log_event)) == FLB_EVENT_DECODER_SUCCESS) { - map = *log_event.body; - map_size = map.via.map.size; - if (count < 1) { - if (ctx->oci_config_in_record == FLB_FALSE) { - pack_oci_fields(&mp_pck, ctx); - log_group_id = ctx->oci_la_log_group_id; - log_set_id = ctx->oci_la_log_set_id; - } else { - ret1 = get_and_pack_oci_fields_from_record(&mp_pck, map, &log_group_id, &log_set_id, ctx); - if (ret1 != 0) { - break; - } - } - msgpack_pack_str(&mp_pck, FLB_OCI_LOG_RECORDS_SIZE); - msgpack_pack_str_body(&mp_pck, FLB_OCI_LOG_RECORDS, - FLB_OCI_LOG_RECORDS_SIZE); - msgpack_pack_array(&mp_pck, num_records); - count++; - } - - for(i = 0; i < map_size; i++) { - if (check_config_from_record(map.via.map.ptr[i].key, - "message", - 7) == FLB_TRUE) { - msg = i; - } - if (check_config_from_record(map.via.map.ptr[i].key, - "log", - 3) == FLB_TRUE) { - log = i; - } - } - if (log >= 0) { - msgpack_pack_str(&mp_pck, map.via.map.ptr[log].val.via.str.size); - msgpack_pack_str_body(&mp_pck, map.via.map.ptr[log].val.via.str.ptr, - map.via.map.ptr[log].val.via.str.size); - } - else if (msg >= 0) { - msgpack_pack_str(&mp_pck, map.via.map.ptr[msg].val.via.str.size); - msgpack_pack_str_body(&mp_pck, map.via.map.ptr[msg].val.via.str.ptr, - map.via.map.ptr[msg].val.via.str.size); - } - log = -1; - msg = -1; - } - - if (ret1 != 0) { - res = FLB_ERROR; - msgpack_sbuffer_destroy(&mp_sbuf); - flb_log_event_decoder_destroy(&log_decoder); - goto clean_up; - } - - out_buf = flb_msgpack_raw_to_json_sds(mp_sbuf.data, mp_sbuf.size); - msgpack_sbuffer_destroy(&mp_sbuf); - flb_log_event_decoder_destroy(&log_decoder); - - flb_plg_debug(ctx->ins, "payload=%s", out_buf); - flb_plg_debug(ctx->ins, "lg_id=%s", log_group_id); - - ret = flush_to_endpoint(ctx, out_buf, log_group_id, log_set_id); - if(ret != FLB_OK) { - res = FLB_RETRY; - goto clean_up; - } - - clean_up: - if (out_buf != NULL) { - flb_sds_destroy(out_buf); - } - if (log_group_id != NULL && ctx->oci_config_in_record) { - flb_sds_destroy(log_group_id); - } - if (log_set_id != NULL && ctx->oci_config_in_record) { - flb_sds_destroy(log_set_id); - } - return res; -} - -static void cb_oci_logan_flush(struct flb_event_chunk *event_chunk, - struct flb_output_flush *out_flush, - struct flb_input_instance *ins, void *out_context, - struct flb_config *config) -{ - struct flb_oci_logan *ctx = out_context; - int ret = -1; - - ret = total_flush(event_chunk, out_flush, - ins, out_context, - config); - if (ret != FLB_OK) { - flb_oci_logan_conf_destroy(ctx); - FLB_OUTPUT_RETURN(ret); - } - flb_plg_debug(ctx->ins, "success"); - - FLB_OUTPUT_RETURN(FLB_OK); - -} - -static int cb_oci_logan_exit(void *data, struct flb_config *config) -{ - struct flb_oci_logan *ctx = data; - - flb_oci_logan_conf_destroy(ctx); - return 0; -} - -/* Configuration properties map */ -static struct flb_config_map config_map[] = { - { - FLB_CONFIG_MAP_STR, "config_file_location", "", - 0, FLB_TRUE, offsetof(struct flb_oci_logan, config_file_location), - "Location of the oci config file for user api key signing" - }, - { - FLB_CONFIG_MAP_STR, "profile_name", "DEFAULT", - 0, FLB_TRUE, offsetof(struct flb_oci_logan, profile_name), - "name of the profile in the config file from which the user configs should be loaded" - }, - { - FLB_CONFIG_MAP_BOOL, "oci_config_in_record", "false", - 0, FLB_TRUE, offsetof(struct flb_oci_logan, oci_config_in_record), - "If true, oci_la_* configs will be read from the record" - }, - { - FLB_CONFIG_MAP_STR, "uri", NULL, - 0, FLB_TRUE, offsetof(struct flb_oci_logan, uri), - "Set the uri for rest api request" - }, - { - FLB_CONFIG_MAP_STR, "oci_la_log_group_id", NULL, - 0, FLB_TRUE, offsetof(struct flb_oci_logan, oci_la_log_group_id), - "log group id" - }, - { - FLB_CONFIG_MAP_STR, "oci_la_log_set_id", NULL, - 0, FLB_TRUE, offsetof(struct flb_oci_logan, oci_la_log_set_id), - "" - }, - { - FLB_CONFIG_MAP_STR, "oci_la_entity_id", NULL, - 0, FLB_TRUE, offsetof(struct flb_oci_logan, oci_la_entity_id), - "" - }, - { - FLB_CONFIG_MAP_STR, "oci_la_entity_type", NULL, - 0, FLB_TRUE, offsetof(struct flb_oci_logan, oci_la_entity_type), - "" - }, - { - FLB_CONFIG_MAP_STR, "oci_la_log_source_name", NULL, - 0, FLB_TRUE, offsetof(struct flb_oci_logan, oci_la_log_source_name), - "" - }, - { - FLB_CONFIG_MAP_STR, "oci_la_log_set_id", NULL, - 0, FLB_TRUE, offsetof(struct flb_oci_logan, oci_la_log_set_id), - "" - }, - { - FLB_CONFIG_MAP_STR, "oci_la_log_path", NULL, - 0, FLB_TRUE, offsetof(struct flb_oci_logan, oci_la_log_path), - "" - }, - { - FLB_CONFIG_MAP_SLIST_2, "oci_la_global_metadata", NULL, - FLB_CONFIG_MAP_MULT, FLB_TRUE, offsetof(struct flb_oci_logan, oci_la_global_metadata), - "" - }, - { - FLB_CONFIG_MAP_SLIST_2, "oci_la_metadata", NULL, - FLB_CONFIG_MAP_MULT, FLB_TRUE, offsetof(struct flb_oci_logan, oci_la_metadata), - "" - }, - { - FLB_CONFIG_MAP_STR, "namespace", NULL, - 0, FLB_TRUE, offsetof(struct flb_oci_logan, namespace), - "namespace in your tenancy where the log objects reside" - }, - { - FLB_CONFIG_MAP_STR, "proxy", NULL, - 0, FLB_TRUE, offsetof(struct flb_oci_logan, proxy), - "define proxy if required, in http://host:port format, supports only http protocol" - }, - - {0} -}; - -/* Plugin reference */ -struct flb_output_plugin out_oracle_log_analytics_plugin = { - .name = "oracle_log_analytics", - .description = "Oracle log analytics", - .cb_init = cb_oci_logan_init, - .cb_pre_run = NULL, - .cb_flush = cb_oci_logan_flush, - .cb_exit = cb_oci_logan_exit, - - /* Configuration */ - .config_map = config_map, - - /* Events supported */ - .event_type = FLB_OUTPUT_LOGS, - - - /* Plugin flags */ - .flags = FLB_OUTPUT_NET | FLB_IO_OPT_TLS, - .workers = 1, -}; |