1 /*
2  * Copyright 2008-2019 by Emeric Vernat
3  *
4  *     This file is part of Java Melody.
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *     http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  */

18 package net.bull.javamelody.internal.model;
19
20 import java.io.Serializable;
21
22 /**
23  * Données Real User Monitoring (<a href='https://en.wikipedia.org/wiki/Real_user_monitoring'>RUM</a>) d'une requête http.
24  * @author Emeric Vernat
25  */

26 public class CounterRequestRumData implements Serializable, Cloneable {
27     private static final long serialVersionUID = 745110095604593659L;
28
29     // au-delà de 5 minutes, on considère une valeur RUM comme aberrante et à ignorer
30     private static final long ABERRANT_VALUE = 5 * 60 * 1000;
31
32     private long hits;
33     private long networkTimeSum;
34     private long domProcessingSum;
35     private long pageRenderingSum;
36
37     public long getHits() {
38         return hits;
39     }
40
41     public int getNetworkTimeMean() {
42         if (hits > 0) {
43             return (int) (networkTimeSum / hits);
44         }
45         return -1;
46     }
47
48     public int getDomProcessingMean() {
49         if (hits > 0) {
50             return (int) (domProcessingSum / hits);
51         }
52         return -1;
53     }
54
55     public int getPageRenderingMean() {
56         if (hits > 0) {
57             return (int) (pageRenderingSum / hits);
58         }
59         return -1;
60     }
61
62     void addHit(long networkTime, long domProcessing, long pageRendering) {
63         if (networkTime < 0 || networkTime > ABERRANT_VALUE || domProcessing < 0
64                 || domProcessing > ABERRANT_VALUE || pageRendering < 0
65                 || pageRendering > ABERRANT_VALUE) {
66             // aberrant value, we ignore it
67             return;
68         }
69
70         networkTimeSum += networkTime;
71         domProcessingSum += domProcessing;
72         pageRenderingSum += pageRendering;
73         hits++;
74     }
75
76     void addHits(CounterRequestRumData rumData) {
77         if (rumData.hits != 0) {
78             hits += rumData.hits;
79             networkTimeSum += rumData.networkTimeSum;
80             domProcessingSum += rumData.domProcessingSum;
81             pageRenderingSum += rumData.pageRenderingSum;
82         }
83     }
84
85     void removeHits(CounterRequestRumData rumData) {
86         if (rumData.hits != 0) {
87             hits -= rumData.hits;
88             networkTimeSum -= rumData.networkTimeSum;
89             domProcessingSum -= rumData.domProcessingSum;
90             pageRenderingSum -= rumData.pageRenderingSum;
91         }
92     }
93
94     /** {@inheritDoc} */
95     @Override
96     public CounterRequestRumData clone() { // NOPMD
97         try {
98             return (CounterRequestRumData) super.clone();
99         } catch (final CloneNotSupportedException e) {
100             // ne peut arriver puisque CounterRequest implémente Cloneable
101             throw new IllegalStateException(e);
102         }
103     }
104
105     /** {@inheritDoc} */
106     @Override
107     public String toString() {
108         return getClass().getSimpleName() + "[hits=" + hits + ']';
109     }
110 }
111