Line data Source code
1 : /********************************************************************************
2 : * Copyright (c) 2026 Accenture
3 : *
4 : * This program and the accompanying materials are made available under the
5 : * terms of the Apache License Version 2.0 which is available at
6 : * https://www.apache.org/licenses/LICENSE-2.0
7 : *
8 : * SPDX-License-Identifier: Apache-2.0
9 : ********************************************************************************/
10 :
11 : #pragma once
12 :
13 : #include "someip/QueryManager.h"
14 : #include "someip/Statistics.h"
15 :
16 : #include <async/Types.h>
17 : #include <async/util/Call.h>
18 :
19 : #include <cstdint>
20 :
21 : namespace someip
22 : {
23 : class IServiceRegistry;
24 : class QueryManager;
25 : } // namespace someip
26 :
27 : namespace someip
28 : {
29 : class StatisticsEvaluator
30 : {
31 : public:
32 : StatisticsEvaluator(
33 : ::async::ContextType const ethernetContext,
34 : IServiceRegistry& serviceRegistry,
35 : QueryManager& queryManager);
36 :
37 10 : virtual ~StatisticsEvaluator() = default;
38 :
39 : void init();
40 : void shutdown();
41 :
42 : void reset();
43 :
44 : void cyclic();
45 :
46 : uint32_t getNumReceivedMessagesPerSecond() const;
47 : uint32_t getNumSentMessagesPerSecond() const;
48 : uint32_t getNumReceivedSdMessagesPerSecond() const;
49 : uint32_t getNumSentSdMessagesPerSecond() const;
50 :
51 : uint32_t getNumSentTrainsPerSecond() const;
52 :
53 : uint32_t getNumTrainsSentBecauseFullPerSecond() const;
54 :
55 : uint32_t getNumTrainsSentBecauseNoFreeTrainPerSecond() const;
56 :
57 : uint32_t getNumTrainsSentBecauseDuplicatePduPerSecond() const;
58 :
59 : uint32_t getNumTrainsSentBecauseTimeoutPerSecond() const;
60 :
61 : private:
62 : static uint32_t safeDivide(uint32_t numerator, uint32_t denominator);
63 :
64 : ::async::ContextType const _ethernetContext;
65 : ::async::Function _cyclicFunction;
66 : ::async::TimeoutType _cyclicTimeout;
67 : IServiceRegistry& _serviceRegistry;
68 : QueryManager& _queryManager;
69 : uint32_t _secondsExpired;
70 : };
71 :
72 : /*
73 : * inline implementation
74 : */
75 2 : inline uint32_t StatisticsEvaluator::getNumReceivedMessagesPerSecond() const
76 : {
77 2 : return safeDivide(Statistics::getCounter(Statistics::Counter::PDU_RX), _secondsExpired);
78 : }
79 :
80 2 : inline uint32_t StatisticsEvaluator::getNumSentMessagesPerSecond() const
81 : {
82 2 : return safeDivide(Statistics::getCounter(Statistics::Counter::PDU_TX), _secondsExpired);
83 : }
84 :
85 2 : inline uint32_t StatisticsEvaluator::getNumReceivedSdMessagesPerSecond() const
86 : {
87 2 : return safeDivide(Statistics::getCounter(Statistics::Counter::SD_FRAME_RX), _secondsExpired);
88 : }
89 :
90 2 : inline uint32_t StatisticsEvaluator::getNumSentSdMessagesPerSecond() const
91 : {
92 2 : return safeDivide(Statistics::getCounter(Statistics::Counter::SD_FRAME_TX), _secondsExpired);
93 : }
94 :
95 2 : inline uint32_t StatisticsEvaluator::getNumSentTrainsPerSecond() const
96 : {
97 2 : return safeDivide(Statistics::getNumSentTrains(), _secondsExpired);
98 : }
99 :
100 2 : inline uint32_t StatisticsEvaluator::getNumTrainsSentBecauseFullPerSecond() const
101 : {
102 2 : return safeDivide(Statistics::getCounter(Statistics::Counter::TRAIN_FULL), _secondsExpired);
103 : }
104 :
105 2 : inline uint32_t StatisticsEvaluator::getNumTrainsSentBecauseNoFreeTrainPerSecond() const
106 : {
107 2 : return safeDivide(
108 4 : Statistics::getCounter(Statistics::Counter::TRAIN_NOT_AVAILABLE), _secondsExpired);
109 : }
110 :
111 2 : inline uint32_t StatisticsEvaluator::getNumTrainsSentBecauseDuplicatePduPerSecond() const
112 : {
113 2 : return safeDivide(
114 4 : Statistics::getCounter(Statistics::Counter::TRAIN_DUPLICATE_PDU), _secondsExpired);
115 : }
116 :
117 2 : inline uint32_t StatisticsEvaluator::getNumTrainsSentBecauseTimeoutPerSecond() const
118 : {
119 2 : return safeDivide(Statistics::getCounter(Statistics::Counter::TRAIN_TIMEOUT), _secondsExpired);
120 : }
121 :
122 : // static
123 : inline uint32_t
124 18 : StatisticsEvaluator::safeDivide(uint32_t const numerator, uint32_t const denominator)
125 : {
126 18 : if (denominator > 0U)
127 : {
128 9 : return numerator / denominator;
129 : }
130 :
131 9 : return 0U;
132 : }
133 :
134 : } // namespace someip
|