static void txn_handler(TSHttpTxn txnp, TSCont contp) { int64_t num_txns = 0; INKStatIncrement(transaction_count); num_txns = INKStatIntGet(transaction_count); TSDebug("tag_session", "The number of transactions is %" PRId64, num_txns); }
static void handle_session(TSHttpSsn ssnp, TSCont contp) { int64_t num_ssn = 0; INKStatIncrement(session_count); num_ssn = INKStatIntGet(session_count); TSDebug("tag_session", "The number of sessions is %" PRId64, num_ssn); TSHttpSsnHookAdd(ssnp, TS_HTTP_TXN_START_HOOK, contp); }
/* * This function is only called for redirected requests. It illustrates * several different ways of updating INT64 stats. Some may consider * the particular use of TSDecrementStat() shown below somewhat contrived. */ void update_redirected_method_stats(TSMBuffer bufp, TSMLoc hdr_loc) { const char *txn_method; int length; int64_t tempint; txn_method = TSHttpHdrMethodGet(bufp, hdr_loc, &length); if (NULL != txn_method) { if (0 == strncmp(txn_method, TS_HTTP_METHOD_CONNECT, length)) INKStatIncrement(method_count_redirected_connect); else if (0 == strncmp(txn_method, TS_HTTP_METHOD_DELETE, length)) INKStatIncrement(method_count_redirected_delete); else if (0 == strncmp(txn_method, TS_HTTP_METHOD_GET, length)) INKStatIncrement(method_count_redirected_get); else if (0 == strncmp(txn_method, TS_HTTP_METHOD_HEAD, length)) INKStatFloatAddTo(method_count_redirected_head, 1); else if (0 == strncmp(txn_method, TS_HTTP_METHOD_ICP_QUERY, length)) INKStatFloatAddTo(method_count_redirected_icp_query, 1); else if (0 == strncmp(txn_method, TS_HTTP_METHOD_OPTIONS, length)) { tempint = INKStatIntGet(method_count_redirected_options); tempint++; INKStatIntSet(method_count_redirected_options, tempint); } else if (0 == strncmp(txn_method, TS_HTTP_METHOD_POST, length)) { INKStatDecrement(method_count_redirected_post); INKStatIncrement(method_count_redirected_post); INKStatIncrement(method_count_redirected_post); } else if (0 == strncmp(txn_method, TS_HTTP_METHOD_PURGE, length)) INKStatIncrement(method_count_redirected_purge); else if (0 == strncmp(txn_method, TS_HTTP_METHOD_PUT, length)) INKStatIncrement(method_count_redirected_put); else if (0 == strncmp(txn_method, TS_HTTP_METHOD_TRACE, length)) INKStatIncrement(method_count_redirected_trace); else INKStatIncrement(method_count_redirected_unknown); } }
static void handle_client_lookup(TSHttpTxn txnp, TSCont contp) { TSMBuffer bufp; TSMLoc hdr_loc, url_loc; int host_length; in_addr_t clientip = 0; const char *host; /* * Here we declare local coupled statistics variables: */ INKCoupledStat local_request_outcomes; INKStat local_requests_all; INKStat local_requests_redirects; INKStat local_requests_unchanged; /* * Create local copy of the global coupled stat category: */ local_request_outcomes = INKStatCoupledLocalCopyCreate("local_request_outcomes", request_outcomes); /* * Create the local copies of the global coupled stats: */ local_requests_all = INKStatCoupledLocalAdd(local_request_outcomes, "requests.all.local", INKSTAT_TYPE_FLOAT); local_requests_redirects = INKStatCoupledLocalAdd(local_request_outcomes, "requests.redirects.local", INKSTAT_TYPE_INT64); local_requests_unchanged = INKStatCoupledLocalAdd(local_request_outcomes, "requests.unchanged.local", INKSTAT_TYPE_INT64); /* * Increment the count of total requests: * (it is more natural to treat the number of requests as an * integer, but we declare this a FLOAT in order to demonstrate * how to increment coupled FLOAT stats) */ INKStatFloatAddTo(local_requests_all, 1.0); if (TSIsDebugTagSet("redirect")) { struct sockaddr const* addr = TSHttpTxnClientAddrGet(txnp); if (addr) { socklen_t addr_size = 0; if (addr->sa_family == AF_INET) addr_size = sizeof(struct sockaddr_in); else if (addr->sa_family == AF_INET6) addr_size = sizeof(struct sockaddr_in6); if (addr_size > 0) { char clientstring[INET6_ADDRSTRLEN]; if (NULL != inet_ntop(addr->sa_family, addr, clientstring, addr_size)) TSDebug("redirect", "clientip is %s and block_ip is %s", clientstring, block_ip); } } } if (TSHttpTxnClientReqGet(txnp, &bufp, &hdr_loc) != TS_SUCCESS) { TSError("couldn't retrieve client request header\n"); goto done; } if (TSHttpHdrUrlGet(bufp, hdr_loc, &url_loc) != TS_SUCCESS) { TSError("couldn't retrieve request url\n"); TSHandleMLocRelease(bufp, TS_NULL_MLOC, hdr_loc); goto done; } host = TSUrlHostGet(bufp, url_loc, &host_length); if (!host) { TSError("couldn't retrieve request hostname\n"); TSHandleMLocRelease(bufp, hdr_loc, url_loc); TSHandleMLocRelease(bufp, TS_NULL_MLOC, hdr_loc); goto done; } /* * Check to see if the client is already headed to the redirect site. */ if (strncmp(host, url_redirect, host_length) == 0) { TSHandleMLocRelease(bufp, hdr_loc, url_loc); TSHandleMLocRelease(bufp, TS_NULL_MLOC, hdr_loc); goto done; } /* TODO: This is odd, clientip is never set ... */ if (ip_deny == clientip) { TSHttpTxnHookAdd(txnp, TS_HTTP_SEND_RESPONSE_HDR_HOOK, contp); update_redirected_method_stats(bufp, hdr_loc); TSHandleMLocRelease(bufp, hdr_loc, url_loc); TSHandleMLocRelease(bufp, TS_NULL_MLOC, hdr_loc); /* * Increment the local redirect stat and do global update: */ INKStatIncrement(local_requests_redirects); INKStatsCoupledUpdate(local_request_outcomes); INKStatCoupledLocalCopyDestroy(local_request_outcomes); TSHttpTxnReenable(txnp, TS_EVENT_HTTP_ERROR); return; } done: /* * Increment the local number unchanged stat and do global update: */ INKStatIncrement(local_requests_unchanged); INKStatsCoupledUpdate(local_request_outcomes); INKStatCoupledLocalCopyDestroy(local_request_outcomes); TSHttpTxnReenable(txnp, TS_EVENT_HTTP_CONTINUE); }