[SR-Users] Need useful graphics ideas

Karsten Horsmann khorsmann at gmail.com
Fri Mar 16 11:32:44 CET 2018


Hi Joel,

thank you very much for the hints and the input.

I am not sure if i should run that in the REQUEST, but it works for me.

Only headache with that is, that i also use Websockets in my event_route.
And AFAIK there is "only one" event_route[xhttp:request].

Would be nice to separate the /stats to an local bound listener without
break the WS stuff.

An working one is this config snipped for me:

[...]
event_route[xhttp:request] {
        set_reply_close();
        set_reply_no_connect();

        if ($Rp != MY_WS_PORT
#!ifdef WITH_TLS
                && $Rp != MY_WSS_PORT
#!endif
        ) {
                xlog("L_WARN", "HTTP request received on $Rp\n");
                if ($sel(cfg_get.mylog.logint) > 1) {
                        xhttp_reply("200", "OK",
"text/html","<html><body>Received HTTP request to $hu from [$si:$sp] with
protocol $proto</body></html>");
                } else {
                        xhttp_reply("403", "Forbidden", "", "");
                }
                exit;
        }

        xlog("L_DBG", "HTTP Request Received\n");
        xlog("L_INFO", "HTTP Request Received hu:($hu) src_ip:($src_ip)\n");

#!ifdef WITH_JSONSTATS
        # Metrics endpoint
        if ( ($src_ip == "127.0.0.1") && ($hu =~ "^/stats") ) {

                jsonrpc_exec('{"jsonrpc": "2.0","method":
"stats.get_statistics","params": ["all"],"id": 1}');
                $var(metrics_count) = 0;
                jansson_array_size("result", $jsonrpl(body),
"$var(total_metrics)");
                while($var(metrics_count) < $var(total_metrics)) {
                    jansson_get("result[$var(metrics_count)]",
$jsonrpl(body), "$var(v)");
                    $var(metric_key) =
$(var(v){s.select,0,=}{s.trim}{s.replace,:,-});
                    $var(metric_value) = $(var(v){s.select,1,=}{s.trim});
                    jansson_set("integer", "$var(metric_key)",
"$var(metric_value)", "$var(metrics_json)");
                    $var(metrics_count) = $var(metrics_count) + 1;
                }

                xhttp_reply("200", "OK", "application/json",
"$var(metrics_json)");
                exit;

        }
#!endif
        if ($hdr(Upgrade)=~"websocket"
                        && $hdr(Connection)=~"Upgrade"
                        && $rm=~"GET") {

[...]


curl -s --interface lo -k https://MY-WEBRTC-IP:MY-WEBRTC-PORT/stats | jq '.'
{
  "core-bad_URIs_rcvd": 0,
  "core-bad_msg_hdr": 0,
  "core-drop_replies": 0,
  "core-drop_requests": 3,
  "core-err_replies": 0,
  "core-err_requests": 0,
  "core-fwd_replies": 0,
  "core-fwd_requests": 3,
  "core-rcv_replies": 16,
  "core-rcv_replies_18x": 0,
  "core-rcv_replies_1xx": 3,
  "core-rcv_replies_2xx": 13,
  "core-rcv_replies_3xx": 0,
  "core-rcv_replies_401": 0,
  "core-rcv_replies_404": 0,
  "core-rcv_replies_407": 0,
  "core-rcv_replies_480": 0,
  "core-rcv_replies_486": 0,
  "core-rcv_replies_4xx": 0,
  "core-rcv_replies_5xx": 0,
  "core-rcv_replies_6xx": 0,
  "core-rcv_requests": 30,
  "core-rcv_requests_ack": 3,
  "core-rcv_requests_bye": 3,
  "core-rcv_requests_cancel": 0,
  "core-rcv_requests_info": 0,
  "core-rcv_requests_invite": 6,
  "core-rcv_requests_message": 0,
  "core-rcv_requests_notify": 0,
  "core-rcv_requests_options": 8,
  "core-rcv_requests_prack": 0,
  "core-rcv_requests_publish": 0,
  "core-rcv_requests_refer": 0,
  "core-rcv_requests_register": 0,
  "core-rcv_requests_subscribe": 0,
  "core-rcv_requests_update": 0,
  "core-unsupported_methods": 0,
  "dns-failed_dns_request": 0,
  "mysql-driver_errors": 0,
  "registrar-accepted_regs": 0,
  "registrar-default_expire": 3600,
  "registrar-default_expires_range": 0,
  "registrar-expires_range": 0,
  "registrar-max_contacts": 0,
  "registrar-max_expires": 3600,
  "registrar-rejected_regs": 0,
  "shmem-fragments": 62,
  "shmem-free_size": 1064748608,
  "shmem-max_used_size": 9040400,
  "shmem-real_used_size": 8993216,
  "shmem-total_size": 1073741824,
  "shmem-used_size": 5363816,
  "sl-1xx_replies": 0,
  "sl-200_replies": 17,
  "sl-202_replies": 0,
  "sl-2xx_replies": 0,
  "sl-300_replies": 0,
  "sl-301_replies": 0,
  "sl-302_replies": 0,
  "sl-3xx_replies": 0,
  "sl-400_replies": 0,
  "sl-401_replies": 0,
  "sl-403_replies": 0,
  "sl-404_replies": 0,
  "sl-407_replies": 3,
  "sl-408_replies": 0,
  "sl-483_replies": 0,
  "sl-4xx_replies": 0,
  "sl-500_replies": 0,
  "sl-5xx_replies": 0,
  "sl-6xx_replies": 0,
  "sl-failures": 0,
  "sl-received_ACKs": 3,
  "sl-sent_err_replies": 0,
  "sl-sent_replies": 20,
  "sl-xxx_replies": 0,
  "tcp-con_reset": 0,
  "tcp-con_timeout": 0,
  "tcp-connect_failed": 0,
  "tcp-connect_success": 0,
  "tcp-current_opened_connections": 1,
  "tcp-current_write_queue_size": 0,
  "tcp-established": 10,
  "tcp-local_reject": 0,
  "tcp-passive_open": 10,
  "tcp-send_timeout": 0,
  "tcp-sendq_full": 0,
  "tmx-2xx_transactions": 6,
  "tmx-3xx_transactions": 0,
  "tmx-4xx_transactions": 0,
  "tmx-5xx_transactions": 0,
  "tmx-6xx_transactions": 0,
  "tmx-UAC_transactions": 0,
  "tmx-UAS_transactions": 6,
  "tmx-active_transactions": 0,
  "tmx-inuse_transactions": 0,
  "tmx-rpl_absorbed": 3,
  "tmx-rpl_generated": 3,
  "tmx-rpl_received": 9,
  "tmx-rpl_relayed": 6
}



2018-03-15 22:21 GMT+01:00 Joel Serrano <joel at gogii.net>:

> Hi Karsten,
>
> In my specific case, I had a requirement that it had to be compatible with
> the telegraf httpjson input plugin.
>
> Kamailio by default returns all the metrics in an array, and has a ':' in
> the metric name.
>
> Example:
>
> {
>   "jsonrpc":  "2.0",
>   "result": [
>     "core:bad_URIs_rcvd = 26",
>     "core:bad_msg_hdr = 354",
>     "core:drop_replies = 0",
>     "core:drop_requests = 1634",
>     "core:err_replies = 0",
>     "core:err_requests = 0",
>     "core:fwd_replies = 222",
>     "core:fwd_requests = 140221",
>     "core:rcv_replies = 3633129",
>     "core:rcv_replies_18x = 153980",
>     "core:rcv_replies_1xx = 388669",
>     "core:rcv_replies_2xx = 2844680",
>     "core:rcv_replies_3xx = 0",
>     "core:rcv_replies_401 = 335571",
>     "core:rcv_replies_404 = 1882",
>     "core:rcv_replies_407 = 3960",
>     "core:rcv_replies_480 = 4818",
>     "core:rcv_replies_486 = 6734",
>     "core:rcv_replies_4xx = 388874",
>     "core:rcv_replies_5xx = 10410",
>     "core:rcv_replies_6xx = 496",
>     "core:rcv_requests = 1406155",
>     "core:rcv_requests_ack = 200019",
>     "core:rcv_requests_bye = 141683",
>     "core:rcv_requests_cancel = 32887",
>     "core:rcv_requests_info = 332",
>     "core:rcv_requests_invite = 200125",
>     "core:rcv_requests_message = 0",
>     "core:rcv_requests_notify = 0",
>     "core:rcv_requests_options = 500785",
>     "core:rcv_requests_prack = 0",
>     "core:rcv_requests_publish = 0",
>     "core:rcv_requests_refer = 0",
>     "core:rcv_requests_register = 42",
>     "core:rcv_requests_subscribe = 0",
>     "core:rcv_requests_update = 0",
>     "core:unsupported_methods = 19",
>     "dialog:active_dialogs = 27",
>     "dialog:early_dialogs = 2",
>     "dialog:expired_dialogs = 14",
>     "dialog:failed_dialogs = 59781",
>     "dialog:processed_dialogs = 197375",
>     "dns:failed_dns_request = 5762",
>     "httpclient:connections = 0",
>     "httpclient:connfail = 55",
>     "httpclient:connok = 101123",
>     "pike:blocked_ips = 0",
>     "shmem:fragments = 61",
>     "shmem:free_size = 532084488",
>     "shmem:max_used_size = 5328880",
>     "shmem:real_used_size = 4786424",
>     "shmem:total_size = 536870912",
>     "shmem:used_size = 4454760",
>     "siptrace:traced_replies = 0",
>     "siptrace:traced_requests = 0",
>     "sl:1xx_replies = 0",
>     "sl:200_replies = 827319",
>     "sl:202_replies = 0",
>     "sl:2xx_replies = 0",
>     "sl:300_replies = 0",
>     "sl:301_replies = 0",
>     "sl:302_replies = 0",
>     "sl:3xx_replies = 0",
>     "sl:400_replies = 83",
>     "sl:401_replies = 0",
>     "sl:403_replies = 1847",
>     "sl:404_replies = 4",
>     "sl:407_replies = 0",
>     "sl:408_replies = 0",
>     "sl:483_replies = 0",
>     "sl:4xx_replies = 883",
>     "sl:500_replies = 4",
>     "sl:5xx_replies = 976",
>     "sl:6xx_replies = 0",
>     "sl:failures = 0",
>     "sl:received_ACKs = 1634",
>     "sl:sent_err_replies = 0",
>     "sl:sent_replies = 831116",
>     "sl:xxx_replies = 0",
>     "tcp:con_reset = 0",
>     "tcp:con_timeout = 0",
>     "tcp:connect_failed = 0",
>     "tcp:connect_success = 0",
>     "tcp:current_opened_connections = 1",
>     "tcp:current_write_queue_size = 0",
>     "tcp:established = 2",
>     "tcp:local_reject = 0",
>     "tcp:passive_open = 2",
>     "tcp:send_timeout = 0",
>     "tcp:sendq_full = 0",
>     "tmx:2xx_transactions = 2844324",
>     "tmx:3xx_transactions = 0",
>     "tmx:4xx_transactions = 709680",
>     "tmx:5xx_transactions = 10733",
>     "tmx:6xx_transactions = 495",
>     "tmx:UAC_transactions = 3196487",
>     "tmx:UAS_transactions = 3561209",
>     "tmx:active_transactions = 6",
>     "tmx:inuse_transactions = 7",
>     "tmx:rpl_absorbed = 287838",
>     "tmx:rpl_generated = 571117",
>     "tmx:rpl_received = 3632903",
>     "tmx:rpl_relayed = 3345065",
>     "tmx:rpl_sent = 3916182",
>     "usrloc:registered_users = 0"
>   ],
>   "id": 8362
> }
>
>
> That format (although correct) isn't compatible with what the httpjson
> telegraf plugin expects: https://github.com/influxdata/
> telegraf/tree/master/plugins/inputs/httpjson
>
> I had to build my own JSON in a way that telegraf liked it:
>
>
>         jsonrpc_exec('{"jsonrpc": "2.0","method": "stats.get_statistics","params":
> ["all"],"id": 1}');
>         $var(metrics_count) = 0;
>         jansson_array_size("result", $jsonrpl(body),
> "$var(total_metrics)");
>         while($var(metrics_count) < $var(total_metrics)) {
>             jansson_get("result[$var(metrics_count)]", $jsonrpl(body),
> "$var(v)");
>             $var(metric_key) = $(var(v){s.select,0,=}{s.trim}
> {s.replace,:,-});
>             $var(metric_value) = $(var(v){s.select,1,=}{s.trim});
>             jansson_set("integer", "$var(metric_key)",
> "$var(metric_value)", "$var(metrics_json)");
>             $var(metrics_count) = $var(metrics_count) + 1;
>         }
>
>
> And this is an example if the resulting JSON:
>
> {
>    "core-bad_URIs_rcvd":26,
>    "core-bad_msg_hdr":354,
>    "core-drop_replies":0,
>    "core-drop_requests":1634,
>    "core-err_replies":0,
>    "core-err_requests":0,
>    "core-fwd_replies":222,
>    "core-fwd_requests":140287,
>    "core-rcv_replies":3633735,
>    "core-rcv_replies_18x":154043,
>    "core-rcv_replies_1xx":388838,
>    "core-rcv_replies_2xx":2845062,
>    "core-rcv_replies_3xx":0,
>    "core-rcv_replies_401":335604,
>    "core-rcv_replies_404":1882,
>    "core-rcv_replies_407":3960,
>    "core-rcv_replies_480":4820,
>    "core-rcv_replies_486":6740,
>    "core-rcv_replies_4xx":388925,
>    "core-rcv_replies_5xx":10412,
>    "core-rcv_replies_6xx":498,
>    "core-rcv_requests":1406490,
>    "core-rcv_requests_ack":200107,
>    "core-rcv_requests_bye":141753,
>    "core-rcv_requests_cancel":32896,
>    "core-rcv_requests_info":332,
>    "core-rcv_requests_invite":200211,
>    "core-rcv_requests_message":0,
>    "core-rcv_requests_notify":0,
>    "core-rcv_requests_options":500835,
>    "core-rcv_requests_prack":0,
>    "core-rcv_requests_publish":0,
>    "core-rcv_requests_refer":0,
>    "core-rcv_requests_register":42,
>    "core-rcv_requests_subscribe":0,
>    "core-rcv_requests_update":0,
>    "core-unsupported_methods":19,
>    "dialog-active_dialogs":24,
>    "dialog-early_dialogs":2,
>    "dialog-expired_dialogs":14,
>    "dialog-failed_dialogs":59803,
>    "dialog-processed_dialogs":197460,
>    "dns-failed_dns_request":5762,
>    "httpclient-connections":0,
>    "httpclient-connfail":55,
>    "httpclient-connok":101174,
>    "pike-blocked_ips":0,
>    "shmem-fragments":81,
>    "shmem-free_size":532089200,
>    "shmem-max_used_size":5328880,
>    "shmem-real_used_size":4781712,
>    "shmem-total_size":536870912,
>    "shmem-used_size":4454520,
>    "siptrace-traced_replies":0,
>    "siptrace-traced_requests":0,
>    "sl-1xx_replies":0,
>    "sl-200_replies":827400,
>    "sl-202_replies":0,
>    "sl-2xx_replies":0,
>    "sl-300_replies":0,
>    "sl-301_replies":0,
>    "sl-302_replies":0,
>    "sl-3xx_replies":0,
>    "sl-400_replies":83,
>    "sl-401_replies":0,
>    "sl-403_replies":1847,
>    "sl-404_replies":4,
>    "sl-407_replies":0,
>    "sl-408_replies":0,
>    "sl-483_replies":0,
>    "sl-4xx_replies":883,
>    "sl-500_replies":4,
>    "sl-5xx_replies":976,
>    "sl-6xx_replies":0,
>    "sl-failures":0,
>    "sl-received_ACKs":1634,
>    "sl-sent_err_replies":0,
>    "sl-sent_replies":831197,
>    "sl-xxx_replies":0,
>    "tcp-con_reset":0,
>    "tcp-con_timeout":0,
>    "tcp-connect_failed":0,
>    "tcp-connect_success":0,
>    "tcp-current_opened_connections":2,
>    "tcp-current_write_queue_size":0,
>    "tcp-established":3,
>    "tcp-local_reject":0,
>    "tcp-passive_open":3,
>    "tcp-send_timeout":0,
>    "tcp-sendq_full":0,
>    "tmx-2xx_transactions":2844706,
>    "tmx-3xx_transactions":0,
>    "tmx-4xx_transactions":709758,
>    "tmx-5xx_transactions":10735,
>    "tmx-6xx_transactions":497,
>    "tmx-UAC_transactions":3196787,
>    "tmx-UAS_transactions":3561671,
>    "tmx-active_transactions":5,
>    "tmx-inuse_transactions":6,
>    "tmx-rpl_absorbed":287958,
>    "tmx-rpl_generated":571244,
>    "tmx-rpl_received":3633509,
>    "tmx-rpl_relayed":3345551,
>    "tmx-rpl_sent":3916795,
>    "usrloc-registered_users":0
> }
>
>
> That JSON was correctly parsed by Telegraf and the metrics were inserted
> into InfluxDB correctly.
>
>
> NOTE: In our case we needed all the metrics so we also had to increase the
> *max_while_loops* param: https://www.kamailio.
> org/wiki/cookbooks/devel/core#max_while_loops
>
> I'm sure there are better ways for this, but this one I can tell you is
> working.
>
>
> Let me know how it goes!
>
> Cheers,
> Joel.
>
>
> On Thu, Mar 15, 2018 at 9:22 AM, Karsten Horsmann <khorsmann at gmail.com>
> wrote:
>
>> Hello List,
>> Hello Joel,
>>
>>
>> i have now the time to implement this idea.
>>
>> How you got  $var(metrics_json)  filed with the kamailio stats /
>> whatever internal informations?
>>
>> btw i use kamailio 5.0.6 at this moment.
>>
>> Thanks!
>>
>>
>>
>> 2017-12-06 18:11 GMT+01:00 Joel Serrano <joel at gogii.net>:
>>
>>> I use a mix of the above...
>>>
>>> With kamailio I export that stats I want via http:
>>>
>>>
>>> event_route[xhttp:request] {
>>>     # Verify request come from localhost
>>>     if(src_ip!=127.0.0.1) {
>>>         xhttp_reply("403", "Forbidden", "text/html",
>>> "<html><body>Forbidden</body></html>");
>>>         xlog("L_WARN", "[HTTP] Unauthorized access from: $si\n");
>>>         exit;
>>>     }
>>>
>>>     # Metrics endpoint
>>>     if ($hu =~ "^/statistics") {
>>>
>>>         ... build a $var(metrics_json) with the metrics you want, must
>>> be JSON format ...
>>>
>>>         }
>>>         xhttp_reply("200", "OK", "application/json",
>>> "$var(metrics_json)");
>>>     }
>>>     return;
>>> }
>>>
>>>
>>> Then in telegraf I use the httpjson module to gather the metrics:
>>>
>>> ...
>>> [[inputs.httpjson]]
>>>   name_override = "kamailio"
>>>   servers = [ "http://127.0.0.1/statistics" ]
>>>   method = "GET"
>>> ...
>>>
>>>
>>>
>>> This is an example:
>>>
>>> joel at sbc-dev:~$ curl -q http://127.0.0.1/statistics 2> /dev/null |
>>> python -m json.tool
>>> {
>>>     "core-bad_URIs_rcvd": 0,
>>> [cut some output
>>>     "tmx-rpl_received": 436444,
>>>     "tmx-rpl_relayed": 379358,
>>>     "tmx-rpl_sent": 489589,
>>>     "usrloc-registered_users": 0
>>> }
>>> joel at sbc-dev:~$
>>>
>>>
>>> We have all those metrics available now in influxdb, then, as others
>>> have stated, Grafana is your best friend to make those metrics look nice.
>>>
>>>
>>> Hope these little snippets help you and anyone else getting started with
>>> Kamailio metrics.
>>>
>>>
>>> Cheers,
>>> Joel.
>>>
>>> On Wed, Dec 6, 2017 at 1:20 AM, Daniel-Constantin Mierla <
>>> miconda at gmail.com> wrote:
>>>
>>>> Hello,
>>>>
>>>> have you seen the article posted at:
>>>>
>>>>   - https://www.kamailio.org/w/2015/03/kamailio-statsd-best-practices/
>>>>
>>>> Eloy had a blog about it linked from above page.
>>>>
>>>> Cheers,
>>>> Daniel
>>>>
>>>> On 06.12.17 08:54, Karsten Horsmann wrote:
>>>>
>>>> Hello List,
>>>>
>>>> I thought about some kind of Kamailio stats source (like registered
>>>> users, calls active and some other things) to collect them into influx dB
>>>> and draw them with grafana.
>>>>
>>>> How do you solved that?
>>>>
>>>> Timer based routes or statsd or whatever?
>>>>
>>>> Kind regards
>>>> Karsten Horsmann
>>>>
>>>>
>>>> _______________________________________________
>>>> Kamailio (SER) - Users Mailing Listsr-users at lists.kamailio.orghttps://lists.kamailio.org/cgi-bin/mailman/listinfo/sr-users
>>>>
>>>>
>>>> --
>>>> Daniel-Constantin Mierlawww.twitter.com/miconda -- www.linkedin.com/in/miconda
>>>> Kamailio Advanced Training - www.asipto.com
>>>> Kamailio World Conference - May 14-16, 2018 - www.kamailioworld.com
>>>>
>>>>
>>>> _______________________________________________
>>>> Kamailio (SER) - Users Mailing List
>>>> sr-users at lists.kamailio.org
>>>> https://lists.kamailio.org/cgi-bin/mailman/listinfo/sr-users
>>>>
>>>>
>>>
>>
>>
>> --
>> Kind Regards
>> *Karsten Horsmann*
>>
>
>


-- 
Mit freundlichen Grüßen
*Karsten Horsmann*
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.kamailio.org/pipermail/sr-users/attachments/20180316/9baa8c4e/attachment.html>


More information about the sr-users mailing list