/** * Perf Event Start Event Callback. * * On a connection started event we register connection * counters for the connection. * * @param[in] ib IronBee object. * @param[in] event Event type. * @param[in] connp Connection object. * @param[in] cbdata Callback data: actually an perf_info_t describing the * event. */ static ib_status_t mod_perf_stats_reg_conn_counter( ib_engine_t *ib, ib_state_event_type_t event_type, ib_conn_t *connp, void *cbdata ) { IB_FTRACE_INIT(); perf_info_t *perf_info; event_info_t *eventp = (event_info_t *)cbdata; int cevent = eventp->number; int rc; int event; perf_info = ib_mpool_alloc(connp->mp, sizeof(*perf_info) * IB_STATE_EVENT_NUM); for (event = 0; event < IB_STATE_EVENT_NUM; ++event) { if ((eventp->cbdata_type == IB_CBDATA_NONE) || (eventp->cbdata_type == IB_CBDATA_CONN_DATA_T)) { ib_log_error(ib, "Cannot collect stats for:%d name:%s cbdata_type: %d", eventp->number, eventp->name, eventp->cbdata_type); } else { perf_info_t *perfp = &perf_info[event]; /* Does this event match conn_started_event? * If so we should init counters for this event. */ if (event == cevent) { perfp->call_cnt = 1; perfp->start_usec = ib_clock_get_time(); } else { perfp->call_cnt = 0; perfp->start_usec = 0; } /* Setup other defaults */ perfp->number = event; perfp->name = ib_state_event_name((ib_state_event_type_t)event); perfp->cbdata_type = ib_state_event_cbdata_type(event); perfp->max_usec = 0; perfp->total_usec = 0; perfp->stop_usec = 0; ib_log_debug(ib, "Perf callback registered %s (%d) (%d)", perfp->name, perfp->number, perfp->cbdata_type); } } rc = ib_hash_set(connp->data, "MOD_PERF_STATS" ,perf_info); if (rc != IB_OK) { ib_log_debug(ib, "Failed to store perf stats in connection data: %s", ib_status_to_string(rc)); IB_FTRACE_RET_STATUS(rc); } IB_FTRACE_RET_STATUS(IB_OK); }
const char* ConstEngine::state_event_name(state_event_e event) { return ib_state_event_name(static_cast<ib_state_event_type_t>(event)); }
/** * @internal * Called when module is loaded * Start event hooks are registered here. * * @param[in] ib IronBee object * @param[in] m Module object * @param[in] cbdata Callback data (unused) */ static ib_status_t perf_stats_init(ib_engine_t *ib, ib_module_t *m, void *cbdata) { /*Detect main context otherwise return IB_ENGINE_CONTEXT_MAIN. */ IB_FTRACE_INIT(); ib_log_debug(ib, "Perf stats module loaded."); ib_status_t rc; int event; /* Register specific handlers for specific events, and a * generic handler for the rest */ for (event = 0; event < IB_STATE_EVENT_NUM; ++event) { event_info_t *eventp = &event_info[event]; /* Record event info */ eventp->number = event; eventp->name = ib_state_event_name((ib_state_event_type_t)event); eventp->cbdata_type = ib_state_event_cbdata_type(event); /* init the per connection counters here. * Otherwise use callback data type. */ if (event == conn_started_event) { rc = ib_hook_conn_register( ib, (ib_state_event_type_t)event, mod_perf_stats_reg_conn_counter, (void *)eventp ); } else if ((eventp->cbdata_type == IB_CBDATA_NONE) || (eventp->cbdata_type == IB_CBDATA_CONN_DATA_T)) { rc = IB_EINVAL; ib_log_error(ib, "Cannot register handler " "for:%d name:%s cbdata_type: %d", eventp->number, eventp->name, eventp->cbdata_type); } else { switch( ib_state_hook_type( (ib_state_event_type_t)event ) ) { case IB_STATE_HOOK_CONN: rc = ib_hook_conn_register( ib, (ib_state_event_type_t)event, mod_perf_stats_event_start_conn_callback, (void *)eventp ); break; case IB_STATE_HOOK_CONNDATA: rc = ib_hook_conndata_register( ib, (ib_state_event_type_t)event, mod_perf_stats_event_start_conndata_callback, (void *)eventp ); break; case IB_STATE_HOOK_TX: rc = ib_hook_tx_register( ib, (ib_state_event_type_t)event, mod_perf_stats_event_start_tx_callback, (void *)eventp ); break; case IB_STATE_HOOK_TXDATA: rc = ib_hook_txdata_register( ib, (ib_state_event_type_t)event, mod_perf_stats_event_start_txdata_callback, (void *)eventp ); break; default: rc = IB_EINVAL; ib_log_error(ib, "Event with unknown hook type: %d/%s", eventp->number, eventp->name); } } if (rc != IB_OK) { ib_log_error(ib, "Hook register for" "event:%d name:%s cbdata_type: %d returned %s", eventp->number, eventp->name, eventp->cbdata_type, ib_status_to_string(rc)); } } IB_FTRACE_RET_STATUS(IB_OK); }