iedemam has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-bsc/+/27081 )
Change subject: WIP: New stats for lchan life duration. ...................................................................... WIP: New stats for lchan life duration. Change-Id: I1b0670c47cb5e0b7776eda89d1e71545ba0e3347 --- M include/osmocom/bsc/bts.h M include/osmocom/bsc/gsm_data.h M src/osmo-bsc/bts.c M src/osmo-bsc/bts_trx_vty.c M src/osmo-bsc/bts_vty.c M src/osmo-bsc/gsm_data.c M src/osmo-bsc/lchan_fsm.c 7 files changed, 61 insertions(+), 0 deletions(-) git pull ssh://gerrit.osmocom.org:29418/osmo-bsc refs/changes/81/27081/1 diff --git a/include/osmocom/bsc/bts.h b/include/osmocom/bsc/bts.h index c4ee39d..f4c96da 100644 --- a/include/osmocom/bsc/bts.h +++ b/include/osmocom/bsc/bts.h @@ -74,6 +74,8 @@ BTS_CTR_LCHAN_BORKEN_EV_TS_ERROR, BTS_CTR_LCHAN_BORKEN_FROM_WAIT_RR_CHAN_MODE_MODIFY_ACK, BTS_CTR_LCHAN_BORKEN_FROM_WAIT_RSL_CHAN_MODE_MODIFY_ACK, + BTS_CTR_LCHAN_TCH_TOTAL_ACTIVE_MILLISECONDS, + BTS_CTR_LCHAN_SDCCH_TOTAL_ACTIVE_MILLISECONDS, BTS_CTR_TS_BORKEN_FROM_NOT_INITIALIZED, BTS_CTR_TS_BORKEN_FROM_UNUSED, BTS_CTR_TS_BORKEN_FROM_WAIT_PDCH_ACT, diff --git a/include/osmocom/bsc/gsm_data.h b/include/osmocom/bsc/gsm_data.h index 910c3d3..017aff9 100644 --- a/include/osmocom/bsc/gsm_data.h +++ b/include/osmocom/bsc/gsm_data.h @@ -748,6 +748,8 @@ * sent ACKs like Immediate Assignment or BSSMAP Assignment Complete, and if other errors * occur later, e.g. during release, that we don't send a NACK out of context. */ bool concluded; + /* Interval timing to capture duration per activation and cummulative active time */ + struct timespec concluded_timestamp; enum gsm0808_cause gsm0808_error_cause; /* Actually used TSC Set. */ int tsc_set; @@ -1125,6 +1127,7 @@ char *gsm_ts_name(const struct gsm_bts_trx_ts *ts); char *gsm_ts_and_pchan_name(const struct gsm_bts_trx_ts *ts); void lchan_update_name(struct gsm_lchan *lchan); +long long gsm_lchan_active_duration_ms(const struct gsm_lchan *lchan); static inline char *gsm_lchan_name(const struct gsm_lchan *lchan) { diff --git a/src/osmo-bsc/bts.c b/src/osmo-bsc/bts.c index 1461585..85161e0 100644 --- a/src/osmo-bsc/bts.c +++ b/src/osmo-bsc/bts.c @@ -1082,6 +1082,12 @@ [BTS_CTR_LCHAN_BORKEN_EV_TS_ERROR] = \ { "lchan_borken:event:ts_error", "LCHAN_EV_TS_ERROR received in a BORKEN state" }, + [BTS_CTR_LCHAN_TCH_TOTAL_ACTIVE_MILLISECONDS] = \ + { "lchan_tch:total:active_milliseconds", + "Cummulative number of active milliseconds on TCH lchans" }, + [BTS_CTR_LCHAN_SDCCH_TOTAL_ACTIVE_MILLISECONDS] = \ + { "lchan_sdcch:total:active_milliseconds", + "Cummulative number of active milliseconds on SDCCH lchans" }, [BTS_CTR_TS_BORKEN_FROM_NOT_INITIALIZED] = \ { "ts_borken:from_state:not_initialized", "Transitions from TS NOT_INITIALIZED state to BORKEN state" }, diff --git a/src/osmo-bsc/bts_trx_vty.c b/src/osmo-bsc/bts_trx_vty.c index 39584a5..9ef57ad 100644 --- a/src/osmo-bsc/bts_trx_vty.c +++ b/src/osmo-bsc/bts_trx_vty.c @@ -569,6 +569,12 @@ vty_out(vty, "BTS %u, TRX %u, Timeslot %u, Lchan %u: Type %s%s", lchan->ts->trx->bts->nr, lchan->ts->trx->nr, lchan->ts->nr, lchan->nr, gsm_lchant_name(lchan->type), VTY_NEWLINE); + + if (lchan->activate.concluded) { + long long duration_ms = gsm_lchan_active_duration_ms(lchan); + vty_out(vty, " Activated %llu ms ago%s", duration_ms, VTY_NEWLINE); + } + vty_out_dyn_ts_details(vty, lchan->ts); vty_out(vty, " Connection: %u, State: %s%s%s%s", lchan->conn ? 1: 0, lchan_state_name(lchan), diff --git a/src/osmo-bsc/bts_vty.c b/src/osmo-bsc/bts_vty.c index 0c7259b..b06b9a8 100644 --- a/src/osmo-bsc/bts_vty.c +++ b/src/osmo-bsc/bts_vty.c @@ -3822,6 +3822,22 @@ rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CHREQ_TOTAL)->current, rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CHREQ_NO_CHANNEL)->current, VTY_NEWLINE); + + uint64_t activations_tch = rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CHAN_ACT_TCH)->current; + uint64_t activations_sdcch = rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CHAN_ACT_SDCCH)->current; + uint64_t duration_tch = rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_LCHAN_TCH_TOTAL_ACTIVE_MILLISECONDS)->current; + uint64_t duration_sdcch = rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_LCHAN_SDCCH_TOTAL_ACTIVE_MILLISECONDS)->current; + vty_out(vty, " Channel Activations : %"PRIu64" TCH", activations_tch); + if (activations_tch > 0) { + vty_out(vty, " (average lifespan %"PRIu64" ms)", duration_tch / activations_tch); + } + vty_out(vty, "%s", VTY_NEWLINE); + vty_out(vty, " %"PRIu64" SDCCH", activations_sdcch); + if (activations_sdcch > 0) { + vty_out(vty, " (average lifespan %"PRIu64" ms)", duration_sdcch / activations_sdcch); + } + vty_out(vty, "%s", VTY_NEWLINE); + vty_out(vty, " Channel Failures : %"PRIu64" rf_failures, %"PRIu64" rll failures%s", rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CHAN_RF_FAIL)->current, rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CHAN_RLL_ERR)->current, diff --git a/src/osmo-bsc/gsm_data.c b/src/osmo-bsc/gsm_data.c index 38d8a7c..1d165f5 100644 --- a/src/osmo-bsc/gsm_data.c +++ b/src/osmo-bsc/gsm_data.c @@ -345,6 +345,19 @@ lchan->nr - (lchan->vamos.is_secondary ? ts->max_primary_lchans : 0)); } +/* Get duration of active time for this lchan in milliseconds */ +long long gsm_lchan_active_duration_ms(const struct gsm_lchan *lchan) { + long long duration = 0; + if (lchan->activate.concluded) { + struct timespec now; + struct timespec elapsed; + osmo_clock_gettime(CLOCK_MONOTONIC, &now); + timespecsub(&now, &lchan->activate.concluded_timestamp, &elapsed); + duration = elapsed.tv_sec * 1000LL + elapsed.tv_nsec / 1000000; + } + return duration; +} + /* obtain the MO structure for a given object instance */ static inline struct gsm_abis_mo * gsm_objclass2mo(struct gsm_bts *bts, uint8_t obj_class, diff --git a/src/osmo-bsc/lchan_fsm.c b/src/osmo-bsc/lchan_fsm.c index 84f8dc5..e9dbc9f 100644 --- a/src/osmo-bsc/lchan_fsm.c +++ b/src/osmo-bsc/lchan_fsm.c @@ -203,6 +203,7 @@ if (lchan->activate.concluded) return; lchan->activate.concluded = true; + osmo_clock_gettime(CLOCK_MONOTONIC, &lchan->activate.concluded_timestamp); switch (lchan->activate.info.activ_for) { case ACTIVATE_FOR_MS_CHANNEL_REQUEST: @@ -1806,6 +1807,20 @@ if (!lchan || !lchan->fi || lchan->fi->state == LCHAN_ST_UNUSED) return; + + /* Add active milliseconds to cummulative counts per channel type */ + long long duration_ms = gsm_lchan_active_duration_ms(lchan); + struct rate_ctr_group *bts_ctrs = lchan->ts->trx->bts->bts_ctrs; + if (lchan->type == GSM_LCHAN_TCH_F || lchan->type == GSM_LCHAN_TCH_H) { + LOG_LCHAN(lchan, LOGL_INFO, "GSM_LCHAN_TCH was active for %llu milliseconds\n", duration_ms); + rate_ctr_add(rate_ctr_group_get_ctr(bts_ctrs, BTS_CTR_LCHAN_TCH_TOTAL_ACTIVE_MILLISECONDS), duration_ms); + } else if (lchan->type == GSM_LCHAN_SDCCH) { + LOG_LCHAN(lchan, LOGL_INFO, "GSM_LCHAN_SDCCH was active for %llu milliseconds\n", duration_ms); + rate_ctr_add(rate_ctr_group_get_ctr(bts_ctrs, BTS_CTR_LCHAN_SDCCH_TOTAL_ACTIVE_MILLISECONDS), duration_ms); + } else { + LOG_LCHAN(lchan, LOGL_NOTICE, "UNKNOWN CHANNEL TYPE was active for %llu milliseconds\n", duration_ms); + } + if (lchan->release.in_release_handler) return; lchan->release.in_release_handler = true; -- To view, visit https://gerrit.osmocom.org/c/osmo-bsc/+/27081 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-bsc Gerrit-Branch: master Gerrit-Change-Id: I1b0670c47cb5e0b7776eda89d1e71545ba0e3347 Gerrit-Change-Number: 27081 Gerrit-PatchSet: 1 Gerrit-Owner: iedemam <mich...@kapsulate.com> Gerrit-MessageType: newchange