Skip to content

Commit

Permalink
Tweak event aggregations exposed on /metrics (#2495)
Browse files Browse the repository at this point in the history
This PR changes the aggregations exposed on /metrics to be more useful:
* remove the metrics for the non-official / other domain
* add prepare delegation count for https://identity.ic0.app

This allow to have both, aggregated session time _and_ count be displayed
on the Grafana dashboard, while keeping the number of metrics tracked by
victoria metrics low.
  • Loading branch information
frederikrothenberger authored Jun 6, 2024
1 parent e8c1ab1 commit 818a65a
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 45 deletions.
31 changes: 17 additions & 14 deletions src/internet_identity/src/http/metrics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@ use crate::state::PersistentState;
use crate::stats::activity_stats::activity_counter::ActivityCounter;
use crate::stats::activity_stats::ActivityStats;
use crate::stats::event_stats::AggregationWindow::{Day, Month};
use crate::stats::event_stats::{retrieve_aggregation, Aggregation, PD_SESS_SEC};
use crate::stats::event_stats::{retrieve_aggregation, Aggregation, PD_COUNT, PD_SESS_SEC};
use crate::{state, IC0_APP_DOMAIN, INTERNETCOMPUTER_ORG_DOMAIN};
use ic_cdk::api::stable::stable64_size;
use ic_cdk::api::time;
use ic_metrics_encoder::{LabeledMetricsBuilder, MetricsEncoder};
use std::time::Duration;
use IIDomain::{Ic0App, InternetComputerOrg};
use IIDomain::Ic0App;

/// Collects the various metrics exposed by the Internet Identity canister.
/// Returns a ascii-encoded string of the metrics in the Prometheus exposition format.
Expand Down Expand Up @@ -152,6 +152,11 @@ fn event_metrics(w: &mut MetricsEncoder<Vec<u8>>) -> Result<(), std::io::Error>
"Cumulative authenticated session duration in seconds for the given front-end origin.",
)?;
pd_aggregation_metrics(PD_SESS_SEC, sess_sec_builder)?;
let count_builder = w.gauge_vec(
"internet_identity_prepare_delegation_count",
"Number of authenticated sessions for the given front-end origin.",
)?;
pd_aggregation_metrics(PD_COUNT, count_builder)?;
Ok(())
}

Expand All @@ -160,19 +165,17 @@ fn pd_aggregation_metrics(
mut metrics_builder: LabeledMetricsBuilder<Vec<u8>>,
) -> Result<(), std::io::Error> {
for window in &[Day, Month] {
for domain in &[None, Some(Ic0App), Some(InternetComputerOrg)] {
let data = retrieve_aggregation(aggregation, window.clone(), domain.clone());
let data = retrieve_aggregation(aggregation, window.clone(), Some(Ic0App));

for (frontend_origin, sess_sec) in data.iter().take(10) {
metrics_builder = metrics_builder.value(
&[
("dapp", frontend_origin),
("window", window.label()),
("ii_origin", maybe_domain_to_label(domain)),
],
*sess_sec as f64,
)?;
}
for (frontend_origin, sess_sec) in data.iter().take(10) {
metrics_builder = metrics_builder.value(
&[
("dapp", frontend_origin),
("window", window.label()),
("ii_origin", maybe_domain_to_label(&Some(Ic0App))),
],
*sess_sec as f64,
)?;
}
}
Ok(())
Expand Down
53 changes: 22 additions & 31 deletions src/internet_identity/tests/integration/http.rs
Original file line number Diff line number Diff line change
Expand Up @@ -609,9 +609,9 @@ fn should_list_aggregated_session_seconds_and_event_data_counters() -> Result<()
api::prepare_delegation(
&env,
canister_id,
test_authn_method().principal(),
authn_method_ic0.principal(),
user_number_1,
"https://some-dapp-1.com",
"https://some-dapp-2.com",
&pub_session_key,
Some(Duration::from_secs(3600).as_nanos() as u64),
)?;
Expand All @@ -637,33 +637,23 @@ fn should_list_aggregated_session_seconds_and_event_data_counters() -> Result<()
let metrics = get_metrics(&env, canister_id);
assert_metric(
&metrics,
"internet_identity_prepare_delegation_session_seconds{dapp=\"https://some-dapp-1.com\",window=\"24h\",ii_origin=\"other\"}",
5400f64,
);
assert_metric(
&metrics,
"internet_identity_prepare_delegation_session_seconds{dapp=\"https://some-dapp-1.com\",window=\"30d\",ii_origin=\"other\"}",
"internet_identity_prepare_delegation_session_seconds{dapp=\"https://some-dapp-2.com\",window=\"24h\",ii_origin=\"ic0.app\"}",
5400f64,
);
assert_metric(
&metrics,
"internet_identity_prepare_delegation_session_seconds{dapp=\"https://some-dapp-2.com\",window=\"24h\",ii_origin=\"ic0.app\"}",
1800f64,
"internet_identity_prepare_delegation_count{dapp=\"https://some-dapp-2.com\",window=\"24h\",ii_origin=\"ic0.app\"}",
2f64,
);
assert_metric(
&metrics,
"internet_identity_prepare_delegation_session_seconds{dapp=\"https://some-dapp-2.com\",window=\"30d\",ii_origin=\"ic0.app\"}",
1800f64,
);
assert_metric(
&metrics,
"internet_identity_prepare_delegation_session_seconds{dapp=\"https://some-dapp-3.com\",window=\"24h\",ii_origin=\"internetcomputer.org\"}",
1800f64,
5400f64,
);
assert_metric(
&metrics,
"internet_identity_prepare_delegation_session_seconds{dapp=\"https://some-dapp-3.com\",window=\"30d\",ii_origin=\"internetcomputer.org\"}",
1800f64,
"internet_identity_prepare_delegation_count{dapp=\"https://some-dapp-2.com\",window=\"30d\",ii_origin=\"ic0.app\"}",
2f64,
);
assert_metric(
&get_metrics(&env, canister_id),
Expand All @@ -675,6 +665,15 @@ fn should_list_aggregated_session_seconds_and_event_data_counters() -> Result<()
"internet_identity_event_aggregations_count",
12f64,
);
// make sure aggregations for other II domains are not listed on the metrics endpoint
assert!(
!metrics.contains(
"internet_identity_prepare_delegation_session_seconds{dapp=\"https://some-dapp-1.com\",window=\"24h\""));
assert!(
!metrics.contains(
"internet_identity_prepare_delegation_session_seconds{dapp=\"https://some-dapp-3.com\",window=\"24h\""));
assert!(!metrics.contains("ii_origin=\"other\""));
assert!(!metrics.contains("ii_origin=\"internetcomputer.org\""));

// advance time one day to see it reflected on the daily stats
env.advance_time(Duration::from_secs(60 * 60 * 24));
Expand All @@ -690,32 +689,24 @@ fn should_list_aggregated_session_seconds_and_event_data_counters() -> Result<()
)?;

let metrics = get_metrics(&env, canister_id);
// make sure aggregations that have no data anymore get removed from stats endpoint
assert!(
!metrics.contains(
"internet_identity_prepare_delegation_session_seconds{dapp=\"https://some-dapp-1.com\",window=\"24h\""));
// The 24h metrics should be gone now
assert!(
!metrics.contains(
"internet_identity_prepare_delegation_session_seconds{dapp=\"https://some-dapp-2.com\",window=\"24h\""));
assert!(
!metrics.contains(
"internet_identity_prepare_delegation_session_seconds{dapp=\"https://some-dapp-3.com\",window=\"24h\""));
"internet_identity_prepare_delegation_count{dapp=\"https://some-dapp-2.com\",window=\"24h\""));

// The 30d metrics should still be there
assert_metric(
&metrics,
"internet_identity_prepare_delegation_session_seconds{dapp=\"https://some-dapp-1.com\",window=\"30d\",ii_origin=\"other\"}",
5400f64,
);
assert_metric(
&metrics,
"internet_identity_prepare_delegation_session_seconds{dapp=\"https://some-dapp-2.com\",window=\"30d\",ii_origin=\"ic0.app\"}",
1800f64,
5400f64,
);
assert_metric(
&metrics,
"internet_identity_prepare_delegation_session_seconds{dapp=\"https://some-dapp-3.com\",window=\"30d\",ii_origin=\"internetcomputer.org\"}",
1800f64,
"internet_identity_prepare_delegation_count{dapp=\"https://some-dapp-2.com\",window=\"30d\",ii_origin=\"ic0.app\"}",
2f64,
);
assert_metric(
&get_metrics(&env, canister_id),
Expand Down

0 comments on commit 818a65a

Please sign in to comment.