forked from Dynatrace/ufo
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Datapolling.cpp
157 lines (137 loc) · 6.76 KB
/
Datapolling.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
#include "DataPolling.h"
#include "DisplayCharter.h"
#include "Config.h"
DataPolling::DataPolling(DisplayCharter* pDisplayLowerRing, DisplayCharter* pDisplayUpperRing, IPDisplay* pIpDisplay, Config* pConfig, bool debug){
mpDisplayLowerRing = pDisplayLowerRing;
mpDisplayUpperRing = pDisplayUpperRing;
mpIpDisplay = pIpDisplay;
mpConfig = pConfig;
mDebug = debug;
mInitialized = false;
miApplicationProblems = -1;
miServiceProblems = -1;
miInfrastructureProblems = -1;
}
bool DataPolling::Init(){
if (mpConfig->Changed()){
Shutdown();
}
if (!mpConfig->Enabled()){
Shutdown();
return false;
}
if (mInitialized){
return true;
}
if (httpClient.begin(String(F("https://")) + mpConfig->dynatraceEnvironmentID + F(".live.dynatrace.com/api/v1/problem/status?Api-Token=") + mpConfig->dynatraceApiKey, F("CD:57:0F:00:D7:50:2D:8A:F1:2C:5D:6C:AB:5E:E5:B1:3C:08:99:AC"))){
//if (httpClient.begin("http://192.168.183.31/api/v1/problem/status")){
httpClient.setReuse(true);
mInitialized = true;
return true;
}
else{
return false;
}
}
void DataPolling::Shutdown(){
if (mInitialized){
httpClient.end();
mInitialized = false;
}
}
void DataPolling::Poll() {
if (!Init()) return;
// configure server and url
// NOTE: SSL takes 18kB extra RAM memory!!! leads out-of-memory crash!!!! thus the HTTPserver and all other RAM consuming items must be turned off
// the fingerprint is needed to validate the server certificate
// httpClient.begin(String(F("https://")) + dynatraceEnvironmentID + F(".live.dynatrace.com/api/v1/problem/status?Api-Token=") + dynatraceApiKey, F("CD:57:0F:00:D7:50:2D:8A:F1:2C:5D:6C:AB:5E:E5:B1:3C:08:99:AC"));
if (mDebug) Serial.println(String(F("Before GET. free heap: ")) + String(ESP.getFreeHeap()));
if (mDebug) Serial.flush();
int httpCode = httpClient.GET();
if (httpCode == HTTP_CODE_OK) {
int iLen = httpClient.getSize();
if (iLen > 128) {
if (mDebug) Serial.println(String(F("Dynatrace Problem API call response too large to handle! ")) + String(httpClient.getSize()) + String(F(" bytes")));
Shutdown();
return;
}
mpIpDisplay->StopShowingIp();
if (mDebug) Serial.println(String(F("GET resulted in OK. free heap: ")) + String(ESP.getFreeHeap()));
if (mDebug) Serial.flush();
String json = httpClient.getString(); // this allocates memory, so lets not get this string if the HTTP response is too large
if (mDebug) Serial.println(String(F("Dynatrace Problem API call: ")) + json);
if (mDebug) Serial.flush();
StaticJsonBuffer < 128 + 2 > jsonBuffer; // attention, too large buffers cause stack overflow and thus crashes!
JsonObject& jsonObject = jsonBuffer.parseObject((char*)json.c_str());
bool changeDetected = false;
int i = jsonObject[F("result")][F("openProblemCounts")][F("APPLICATION")];
Serial.println(i);
if (i != miApplicationProblems){
changeDetected = true;
miApplicationProblems = i;
}
i = jsonObject[F("result")][F("openProblemCounts")][F("SERVICE")];
if (i != miServiceProblems){
changeDetected = true;
miServiceProblems = i;
}
i = jsonObject[F("result")][F("openProblemCounts")][F("INFRASTRUCTURE")];
if (i != miInfrastructureProblems){
changeDetected = true;
miInfrastructureProblems = i;
}
if (mDebug){
Serial.println(String(F("Dynatrace Problem API call - Application problems: ")) + String(miApplicationProblems));
Serial.println(String(F("Dynatrace Problem API call - Service problems: ")) + String(miServiceProblems));
Serial.println(String(F("Dynatrace Problem API call - Infrastructure problems: ")) + String(miInfrastructureProblems));
}
if (changeDetected){
int count = miApplicationProblems + miServiceProblems + miInfrastructureProblems;
mpDisplayUpperRing->Init();
mpDisplayLowerRing->Init();
switch (count){
case 0:
mpDisplayUpperRing->SetLeds(0, 15, 0xff0000);
mpDisplayLowerRing->SetLeds(0, 15, 0xff0000);
mpDisplayUpperRing->SetMorph(4000, 6);
mpDisplayLowerRing->SetMorph(4000, 6);
break;
case 1:
mpDisplayUpperRing->SetLeds(0, 15, (miApplicationProblems > 0) ? 0x00ff00 : ((miServiceProblems > 0) ? 0x00ffaa : 0xaaff00));
mpDisplayLowerRing->SetLeds(0, 15, (miApplicationProblems > 0) ? 0x00ff00 : ((miServiceProblems > 0) ? 0x00ffaa : 0xaaff00));
mpDisplayUpperRing->SetMorph(1000, 8);
mpDisplayLowerRing->SetMorph(1000, 8);
break;
case 2:
mpDisplayUpperRing->SetLeds(0, 7, (miApplicationProblems > 0) ? 0x00ff00 : ((miServiceProblems > 0) ? 0x00ffaa : 0xaaff00));
mpDisplayLowerRing->SetLeds(0, 7, (miApplicationProblems > 0) ? 0x00ff00 : ((miServiceProblems > 0) ? 0x00ffaa : 0xaaff00));
mpDisplayUpperRing->SetLeds(8, 6, (miApplicationProblems > 1) ? 0x00ff00 : ((miApplicationProblems + miServiceProblems > 1) ? 0x00ffaa : 0xaaff00));
mpDisplayLowerRing->SetLeds(8, 6, (miApplicationProblems > 1) ? 0x00ff00 : ((miApplicationProblems + miServiceProblems > 1) ? 0x00ffaa : 0xaaff00));
mpDisplayUpperRing->SetWhirl(180, true);
mpDisplayLowerRing->SetWhirl(180, true);
break;
default:
mpDisplayUpperRing->SetLeds(0, 4, (miApplicationProblems > 0) ? 0x00ff00 : ((miServiceProblems > 0) ? 0x00ffaa : 0xaaff00));
mpDisplayLowerRing->SetLeds(0, 4, (miApplicationProblems > 0) ? 0x00ff00 : ((miServiceProblems > 0) ? 0x00ffaa : 0xaaff00));
mpDisplayUpperRing->SetLeds(5, 4, (miApplicationProblems > 1) ? 0x00ff00 : ((miApplicationProblems + miServiceProblems > 1) ? 0x00ffaa : 0xaaff00));
mpDisplayLowerRing->SetLeds(5, 4, (miApplicationProblems > 1) ? 0x00ff00 : ((miApplicationProblems + miServiceProblems > 1) ? 0x00ffaa : 0xaaff00));
mpDisplayUpperRing->SetLeds(10, 4, (miApplicationProblems > 2) ? 0x00ff00 : ((miApplicationProblems + miServiceProblems > 2) ? 0x00ffaa : 0xaaff00));
mpDisplayLowerRing->SetLeds(10, 4, (miApplicationProblems > 2) ? 0x00ff00 : ((miApplicationProblems + miServiceProblems > 2) ? 0x00ffaa : 0xaaff00));
mpDisplayUpperRing->SetWhirl(180, true);
mpDisplayLowerRing->SetWhirl(180, true);
break;
}
}
} else {
if (mDebug) Serial.println(String(F("Dynatrace Problem API call FAILED (error code ")) + httpClient.errorToString(httpCode) + F(")") );
mpDisplayUpperRing->Init();
mpDisplayLowerRing->Init();
mpDisplayUpperRing->SetLeds(0, 3, 0x0000ff);
mpDisplayLowerRing->SetLeds(0, 3, 0x0000ff);
mpDisplayUpperRing->SetWhirl(220, true);
mpDisplayLowerRing->SetWhirl(220, false);
miApplicationProblems = -1;
miServiceProblems = -1;
miInfrastructureProblems = -1;
}
}