示例#1
0
/**
 * 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);
}
示例#2
0
const char* ConstEngine::state_event_name(state_event_e event)
{
    return ib_state_event_name(static_cast<ib_state_event_type_t>(event));
}
示例#3
0
/**
 * @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);
}