From 3f54db64869f957d6ba648527b127c99ce875970 Mon Sep 17 00:00:00 2001 From: Alvaro Miranda Aguilera Date: Sun, 4 Jun 2017 19:03:32 +0200 Subject: [PATCH] add events --- create_function_toddog.sql | 53 +++++++++++++++++++++++++++++--- samples/errtoevent.sql | 32 ++++++++++++++++++++ samples/rowcount.sql | 2 +- src/toddog.c | 62 +++++++++++++++++++++++++++++++++++--- 4 files changed, 139 insertions(+), 10 deletions(-) create mode 100644 samples/errtoevent.sql diff --git a/create_function_toddog.sql b/create_function_toddog.sql index 225e66d..99df914 100644 --- a/create_function_toddog.sql +++ b/create_function_toddog.sql @@ -5,10 +5,10 @@ show err prompt create function f_metrictoddog CREATE OR REPLACE FUNCTION f_metrictoddog ( - name IN VARCHAR2, + name IN VARCHAR2, metric IN BINARY_INTEGER, - kind IN VARCHAR2, - tag IN VARCHAR2) + kind IN VARCHAR2, + tag IN VARCHAR2) RETURN VARCHAR2 AS LANGUAGE C NAME "metrictoddog" LIBRARY libtoddog @@ -29,6 +29,29 @@ PARAMETERS ( / show err +prompt create function f_eventtoddog +CREATE OR REPLACE FUNCTION f_eventtoddog ( + title IN VARCHAR2, + text IN VARCHAR2, + tag IN VARCHAR2) +RETURN VARCHAR2 AS LANGUAGE C +NAME "eventtoddog" +LIBRARY libtoddog +WITH CONTEXT +PARAMETERS ( + CONTEXT, + title STRING, + title INDICATOR short, + text STRING, + text INDICATOR short, + tag STRING, + tag INDICATOR short, + RETURN INDICATOR short, + RETURN LENGTH short, + RETURN STRING); +/ +show err + CREATE OR REPLACE FUNCTION f_gaugetoddog( name IN VARCHAR2, metric IN number, @@ -89,6 +112,28 @@ begin tag := 'source:plsql'; result := f_counttoddog(name,metric,tag); dbms_output.put_line(result); + EXCEPTION + WHEN OTHERS THEN + err_num := SQLCODE; + err_msg := SUBSTR(SQLERRM, 1, 100); + raise_application_error(err_num, err_msg); +END; +/ +show err + +declare + title varchar2(50); + text varchar2(50); + tag varchar2(50); + result varchar2(10); + err_num NUMBER; + err_msg VARCHAR2(100); +begin + title := 'title of event'; + text := 'text for event'; + tag := 'source:plsql'; + result := f_eventtoddog(title,text,tag); + dbms_output.put_line(result); EXCEPTION WHEN OTHERS THEN err_num := SQLCODE; @@ -98,4 +143,4 @@ END; / show err -exit \ No newline at end of file +exit diff --git a/samples/errtoevent.sql b/samples/errtoevent.sql new file mode 100644 index 0000000..1f1d472 --- /dev/null +++ b/samples/errtoevent.sql @@ -0,0 +1,32 @@ +set serveroutput on + +declare + name varchar2(50); + tag varchar2(50); + result varchar2(10); + cursor c_table is + select count(sysdate) as c from dual; + errorsysdate EXCEPTION; + err_num NUMBER; + err_msg VARCHAR2(100); + event_rmsg VARCHAR2(100); +begin + for t in c_table loop + result := t.c; + if result<2 then + event_rmsg := f_eventtoddog('sample event','sample: error counting sysdate, expected 2 or more','sample'); + RAISE errorsysdate; + end if; + end loop; +EXCEPTION + WHEN errorsysdate THEN + raise_application_error(-20101, 'error counting from sysdate, event to ddog:' || event_rmsg); + WHEN OTHERS THEN + err_num := SQLCODE; + err_msg := SUBSTR(SQLERRM, 1, 100); + raise_application_error(err_num, err_msg); +END; +/ +show err + +exit diff --git a/samples/rowcount.sql b/samples/rowcount.sql index ba3426f..15c4304 100644 --- a/samples/rowcount.sql +++ b/samples/rowcount.sql @@ -13,7 +13,7 @@ declare begin name := 'sample.rowcount'; for t in c_table loop - tag := 'table_name:' || t.table_name || ',schema:' || t.owner; + tag := 'table_name:' || t.table_name || ',schema:' || t.owner ; dbms_output.put_line(name || ':' || t.num_rows || ',' || tag); result := f_gaugetoddog(name,t.num_rows,tag); IF result != 'done' THEN diff --git a/src/toddog.c b/src/toddog.c index 22a287a..ce00259 100644 --- a/src/toddog.c +++ b/src/toddog.c @@ -18,7 +18,6 @@ char *metrictoddog( { char *tmp; short len; - char* metricname; char* themetric; // to store the metric we will send to datadog char* thekind; // to store the kind we will send to datadog @@ -35,7 +34,6 @@ char *metrictoddog( } // the main part - strcat(metricname, name); if (kind_i == OCI_IND_NOTNULL) { @@ -46,9 +44,9 @@ char *metrictoddog( if (tag_i == OCI_IND_NOTNULL) { - asprintf(&themetric,"%s:%d|%s|#%s",metricname, metric, thekind,tag); + asprintf(&themetric,"%s:%d|%s|#%s",name, metric, thekind,tag); } else { - asprintf(&themetric,"%s:%d|%s|",metricname, metric, thekind); + asprintf(&themetric,"%s:%d|%s|",name, metric, thekind); } udp(8125, themetric); // we fire the metric to datadog @@ -70,4 +68,58 @@ char *metrictoddog( // Return pointer, which PL/SQL frees later. return tmp; -} \ No newline at end of file +} + + +char *eventtoddog( + OCIExtProcContext *ctx, + char *title, // pointer to name -- name of the metric + short title_i, // null status of name + char *text, // pointer to metric -- number to be sent to the metric + short text_i, // null status of metric + char *tag, // pointer to string1 + short tag_i, // null status of string1 + short *ret_i, // pointer to indicator null or not null + short *ret_l // len of return + ) +{ + char *tmp; + short len; + char* theevent; + + // Check for null inputs + if ( (title_i == OCI_IND_NULL) || (text_i == OCI_IND_NULL) ) + { + *ret_i = (short)OCI_IND_NULL; + + // PL/SQL has no notion of a NULL ptr, so return a zero-byte string. + tmp = OCIExtProcAllocCallMemory(ctx, 1); + tmp[0] = '\0'; + + return(tmp); + } + + // the main part + + asprintf(&theevent,"_e{%d,%d}:%s|%s|#%s",strlen(title),strlen(text),title,text,tag); + + udp(8125, theevent); + + // the reply part + char *reply = "done"; // as udp is stateless, we assume all went fine + + // Allocate memory for result string, including NULL terminator. + len = strlen(reply); + tmp = OCIExtProcAllocCallMemory(ctx, len + 1); + tmp[0] = '\0'; + + // set the reply + strcat(tmp, reply); + + // Set ret indicator and length. + *ret_i = (short)OCI_IND_NOTNULL; + *ret_l = len; + + // Return pointer, which PL/SQL frees later. + return tmp; +}