| // Copyright 2023 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| use analytics::{ga4_metrics, init_ga4_metrics_service}; |
| use anyhow::Context; |
| use std::collections::BTreeMap; |
| use thiserror::Error; |
| |
| pub const GA4_PROPERTY_ID: &str = "G-L10R82HSYT"; |
| pub const GA4_KEY: &str = "mHeVJ5GxQTCvAVCmVHn_dw"; |
| |
| #[derive(Debug, Error)] |
| pub enum MetricsError { |
| #[error("{}",.0)] |
| CouldNotRecordMetrics(#[from] anyhow::Error), |
| } |
| |
| pub trait MetricsService { |
| #[allow(dead_code)] |
| async fn record_invocation( |
| &self, |
| sub_command: String, |
| exit_code: i32, |
| error_message: Option<String>, |
| ) -> Result<(), MetricsError>; |
| } |
| |
| pub struct GaMetricsService {} |
| |
| impl GaMetricsService { |
| pub async fn new(version: String) -> Result<Self, MetricsError> { |
| let _ = init_ga4_metrics_service( |
| String::from("funnel"), |
| Some(version), |
| "no_sdk".to_string(), |
| GA4_PROPERTY_ID.to_string(), |
| GA4_KEY.to_string(), |
| None, |
| ) |
| .await |
| .with_context(|| "Could not initialize metrics service")?; |
| Ok(Self {}) |
| } |
| } |
| |
| impl MetricsService for GaMetricsService { |
| async fn record_invocation( |
| &self, |
| sub_command: String, |
| exit_code: i32, |
| error_message: Option<String>, |
| ) -> Result<(), MetricsError> { |
| let custom_dimensions = BTreeMap::from([ |
| ("exit_code", exit_code.to_string().into()), |
| ("error_message", error_message.unwrap_or_else(|| "".to_string()).into()), |
| ]); |
| let mut metrics_svc = ga4_metrics().await?; |
| metrics_svc |
| .add_custom_event(None, Some(&sub_command), None, custom_dimensions, Some("invoke")) |
| .await?; |
| metrics_svc.send_events().await.map_err(MetricsError::from) |
| } |
| } |