55//! Copyright (c) Memfault, Inc.
66//! See License.txt for details
77//!
8+ //! Copyright (c) Memfault, Inc.
9+ //! See License.txt for details
10+ //!
811//! NOTE: The internals of the metric APIs make use of "X-Macros" to enable more flexibility
912//! improving and extending the internal implementation without impacting the externally facing API
1013
@@ -14,53 +17,36 @@ extern "C" {
1417
1518#include "memfault/config.h"
1619
17- #define MEMFAULT_METRICS_SESSION_TIMER_NAME ( key_name ) mflt_session_timer_##key_name
18-
19- //! Generate extern const char * declarations for all IDs (used in key names):
20- #define MEMFAULT_METRICS_KEY_DEFINE_ ( key_name ) \
21- extern const char *const g_memfault_metrics_id_##key_name;
22-
23- #define MEMFAULT_METRICS_KEY_DEFINE_WITH_RANGE (key_name , value_type , _min , _max ) \
24- MEMFAULT_METRICS_KEY_DEFINE(key_name, value_type )
25-
26- #define MEMFAULT_METRICS_STRING_KEY_DEFINE ( key_name , max_length ) \
27- MEMFAULT_METRICS_KEY_DEFINE(key_name, _ )
28-
29- #define MEMFAULT_METRICS_STRING_KEY_DEFINE_WITH_SESSION ( key_name , max_length , session_name ) \
30- MEMFAULT_METRICS_KEY_DEFINE(key_name, _ )
20+ // Clear any potential issues from transitive dependencies in these files by
21+ // including them one time, with stubs for the macros we need to define. This
22+ // set up any multiple-include guards, and we can safely include the x-macro
23+ // definitions later.
24+
25+ #define MEMFAULT_METRICS_KEY_DEFINE (...)
26+ #define MEMFAULT_METRICS_KEY_DEFINE_WITH_RANGE (...)
27+ #define MEMFAULT_METRICS_STRING_KEY_DEFINE (... )
28+ #define MEMFAULT_METRICS_STRING_KEY_DEFINE_WITH_SESSION (...)
29+ #define MEMFAULT_METRICS_SESSION_KEY_DEFINE (...)
30+ #define MEMFAULT_METRICS_KEY_DEFINE_WITH_SESSION (... )
31+ #define MEMFAULT_METRICS_KEY_DEFINE_WITH_RANGE_AND_SESSION (...)
32+ #define MEMFAULT_METRICS_KEY_DEFINE_WITH_SCALE_VALUE (...)
33+ #define MEMFAULT_METRICS_KEY_DEFINE_WITH_SESSION_AND_SCALE_VALUE (... )
3134
32- #define MEMFAULT_METRICS_SESSION_KEY_DEFINE (key_name ) \
33- MEMFAULT_METRICS_KEY_DEFINE(MEMFAULT_METRICS_SESSION_TIMER_NAME(key_name), _)
34-
35- #define MEMFAULT_METRICS_KEY_DEFINE_WITH_SESSION (key_name , value_type , session_name ) \
36- MEMFAULT_METRICS_KEY_DEFINE(key_name, value_type)
37-
38- #define MEMFAULT_METRICS_KEY_DEFINE_WITH_RANGE_AND_SESSION (key_name , value_type , min_value , \
39- max_value , session_name ) \
40- MEMFAULT_METRICS_KEY_DEFINE(key_name, value_type)
41-
42- #define MEMFAULT_METRICS_KEY_DEFINE_WITH_SCALE_VALUE (key_name , value_type , scale_value ) \
43- MEMFAULT_METRICS_KEY_DEFINE(key_name, value_type)
44-
45- #define MEMFAULT_METRICS_KEY_DEFINE_WITH_SESSION_AND_SCALE_VALUE (key_name , value_type , \
46- session_key , scale_value ) \
47- MEMFAULT_METRICS_KEY_DEFINE(key_name, value_type)
48-
49- #define MEMFAULT_METRICS_KEY_DEFINE (key_name , value_type ) MEMFAULT_METRICS_KEY_DEFINE_(key_name)
5035#include "memfault/metrics/heartbeat_config.def"
5136#include MEMFAULT_METRICS_USER_HEARTBEAT_DEFS_FILE
37+
5238#undef MEMFAULT_METRICS_KEY_DEFINE
5339#undef MEMFAULT_METRICS_KEY_DEFINE_WITH_RANGE
5440#undef MEMFAULT_METRICS_STRING_KEY_DEFINE
5541#undef MEMFAULT_METRICS_STRING_KEY_DEFINE_WITH_SESSION
5642#undef MEMFAULT_METRICS_SESSION_KEY_DEFINE
5743#undef MEMFAULT_METRICS_KEY_DEFINE_WITH_SESSION
5844#undef MEMFAULT_METRICS_KEY_DEFINE_WITH_RANGE_AND_SESSION
59- #undef MEMFAULT_METRICS_KEY_DEFINE_
6045#undef MEMFAULT_METRICS_KEY_DEFINE_WITH_SCALE_VALUE
6146#undef MEMFAULT_METRICS_KEY_DEFINE_WITH_SESSION_AND_SCALE_VALUE
6247
63- #define MEMFAULT_METRICS_KEY_DEFINE_ (key_name ) kMfltMetricsIndex_##key_name,
48+ #define MEMFAULT_METRICS_KEY_DEFINE_ (session_name , key_name ) \
49+ kMfltMetricsIndex_##session_name##__##key_name,
6450
6551//! Generate an enum for all IDs (used for indexing into values)
6652#define MEMFAULT_METRICS_KEY_DEFINE_WITH_RANGE (key_name , value_type , min_value , max_value ) \
@@ -70,26 +56,29 @@ extern "C" {
7056 MEMFAULT_METRICS_KEY_DEFINE(key_name, _)
7157
7258#define MEMFAULT_METRICS_STRING_KEY_DEFINE_WITH_SESSION (key_name , max_length , session_name ) \
73- MEMFAULT_METRICS_KEY_DEFINE(key_name, _ )
59+ MEMFAULT_METRICS_KEY_DEFINE_(session_name, key_name )
7460
75- #define MEMFAULT_METRICS_SESSION_KEY_DEFINE (key_name ) \
76- MEMFAULT_METRICS_KEY_DEFINE(MEMFAULT_METRICS_SESSION_TIMER_NAME(key_name), _)
61+ //! Sessions have the following built-in keys:
62+ //! - "<session name>__MemfaultSdkMetric_IntervalMs"
63+ #define MEMFAULT_METRICS_SESSION_KEY_DEFINE (session_name ) \
64+ kMfltMetricsIndex_##session_name##__##MemfaultSdkMetric_IntervalMs,
7765
7866#define MEMFAULT_METRICS_KEY_DEFINE_WITH_SESSION (key_name , value_type , session_name ) \
79- MEMFAULT_METRICS_KEY_DEFINE(key_name, value_type )
67+ MEMFAULT_METRICS_KEY_DEFINE_(session_name, key_name )
8068
8169#define MEMFAULT_METRICS_KEY_DEFINE_WITH_RANGE_AND_SESSION (key_name , value_type , min_value , \
8270 max_value , session_name ) \
83- MEMFAULT_METRICS_KEY_DEFINE(key_name, value_type )
71+ MEMFAULT_METRICS_KEY_DEFINE_(session_name, key_name )
8472
8573#define MEMFAULT_METRICS_KEY_DEFINE_WITH_SCALE_VALUE (key_name , value_type , scale_value ) \
8674 MEMFAULT_METRICS_KEY_DEFINE(key_name, value_type)
8775
8876#define MEMFAULT_METRICS_KEY_DEFINE_WITH_SESSION_AND_SCALE_VALUE (key_name , value_type , \
8977 session_key , scale_value ) \
90- MEMFAULT_METRICS_KEY_DEFINE(key_name, value_type )
78+ MEMFAULT_METRICS_KEY_DEFINE_(session_key, key_name )
9179
92- #define MEMFAULT_METRICS_KEY_DEFINE (key_name , value_type ) MEMFAULT_METRICS_KEY_DEFINE_(key_name)
80+ #define MEMFAULT_METRICS_KEY_DEFINE (key_name , value_type ) \
81+ MEMFAULT_METRICS_KEY_DEFINE_(heartbeat, key_name)
9382
9483typedef enum MfltMetricsIndex {
9584#include "memfault/metrics/heartbeat_config.def"
@@ -103,17 +92,19 @@ typedef enum MfltMetricsIndex {
10392#undef MEMFAULT_METRICS_KEY_DEFINE_WITH_RANGE_AND_SESSION
10493#undef MEMFAULT_METRICS_KEY_DEFINE_WITH_SCALE_VALUE
10594#undef MEMFAULT_METRICS_KEY_DEFINE_WITH_SESSION_AND_SCALE_VALUE
106- } eMfltMetricsIndex ;
95+ } eMfltMetricsIndexV2 ;
96+ typedef eMfltMetricsIndexV2 eMfltMetricsIndex ;
10797
10898#define MEMFAULT_METRICS_SESSION_KEY_DEFINE (key_name ) kMfltMetricsSessionKey_##key_name,
10999#define MEMFAULT_METRICS_KEY_DEFINE (key_name , value_type )
110100#define MEMFAULT_METRICS_KEY_DEFINE_WITH_RANGE (key_name , value_type , min_value , max_value )
111101#define MEMFAULT_METRICS_STRING_KEY_DEFINE (key_name , max_length )
102+ #define MEMFAULT_METRICS_KEY_DEFINE_WITH_SCALE_VALUE (key_name , value_type , scale_value )
103+
112104#define MEMFAULT_METRICS_STRING_KEY_DEFINE_WITH_SESSION (key_name , max_length , session_key )
113105#define MEMFAULT_METRICS_KEY_DEFINE_WITH_SESSION (key_name , value_type , session_name )
114106#define MEMFAULT_METRICS_KEY_DEFINE_WITH_RANGE_AND_SESSION (key_name , value_type , min_value , \
115107 max_value , session_name )
116- #define MEMFAULT_METRICS_KEY_DEFINE_WITH_SCALE_VALUE (key_name , value_type , scale_value )
117108
118109#define MEMFAULT_METRICS_KEY_DEFINE_WITH_SESSION_AND_SCALE_VALUE (key_name , value_type , \
119110 session_key , scale_value )
@@ -149,10 +140,11 @@ typedef struct {
149140
150141#define MEMFAULT_METRICS_SESSION_KEY (key_name ) kMfltMetricsSessionKey_##key_name
151142
152- #define _MEMFAULT_METRICS_ID_CREATE (id ) \
153- { kMfltMetricsIndex_##id }
143+ #define _MEMFAULT_METRICS_ID_CREATE (id , session_name ) \
144+ { kMfltMetricsIndex_##session_name##__## id }
154145
155- #define _MEMFAULT_METRICS_ID (id ) ((MemfaultMetricId){ kMfltMetricsIndex_##id })
146+ #define _MEMFAULT_METRICS_ID (id , session_name ) \
147+ ((MemfaultMetricId){ kMfltMetricsIndex_##session_name##__##id })
156148
157149#ifdef __cplusplus
158150}
0 commit comments