-
-
Notifications
You must be signed in to change notification settings - Fork 22
/
ControlService.java
160 lines (124 loc) · 5.91 KB
/
ControlService.java
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
158
159
160
package nu.marginalia.control;
import com.google.gson.Gson;
import com.google.inject.Inject;
import nu.marginalia.client.ServiceMonitors;
import nu.marginalia.control.actor.ControlActorService;
import nu.marginalia.control.app.svc.*;
import nu.marginalia.control.node.svc.ControlNodeActionsService;
import nu.marginalia.control.node.svc.ControlFileStorageService;
import nu.marginalia.control.node.svc.ControlNodeService;
import nu.marginalia.control.sys.svc.*;
import nu.marginalia.model.gson.GsonFactory;
import nu.marginalia.screenshot.ScreenshotService;
import nu.marginalia.service.server.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import spark.Request;
import spark.Response;
import spark.Spark;
import java.io.IOException;
import java.util.*;
public class ControlService extends Service {
private final Logger logger = LoggerFactory.getLogger(getClass());
private final Gson gson = GsonFactory.get();
private final ServiceMonitors monitors;
private final HeartbeatService heartbeatService;
private final EventLogService eventLogService;
private final ControlNodeService controlNodeService;
private final StaticResources staticResources;
private final MessageQueueService messageQueueService;
@Inject
public ControlService(BaseServiceParams params,
ServiceMonitors monitors,
HeartbeatService heartbeatService,
EventLogService eventLogService,
ControlRendererFactory rendererFactory,
StaticResources staticResources,
MessageQueueService messageQueueService,
ControlFileStorageService controlFileStorageService,
ApiKeyService apiKeyService,
DomainComplaintService domainComplaintService,
ControlBlacklistService blacklistService,
ControlNodeActionsService nodeActionsService,
ControlSysActionsService sysActionsService,
ScreenshotService screenshotService,
SearchToBanService searchToBanService,
RandomExplorationService randomExplorationService,
DataSetsService dataSetsService,
ControlNodeService controlNodeService,
ControlActorService controlActorService
) throws IOException {
super(params);
this.monitors = monitors;
this.heartbeatService = heartbeatService;
this.eventLogService = eventLogService;
this.controlNodeService = controlNodeService;
// sys
messageQueueService.register();
sysActionsService.register();
dataSetsService.register();
// node
controlFileStorageService.register();
nodeActionsService.register();
controlNodeService.register();
// app
blacklistService.register();
searchToBanService.register();
apiKeyService.register();
domainComplaintService.register();
randomExplorationService.register();
var indexRenderer = rendererFactory.renderer("control/index");
var eventsRenderer = rendererFactory.renderer("control/sys/events");
var serviceByIdRenderer = rendererFactory.renderer("control/sys/service-by-id");
var actionsViewRenderer = rendererFactory.renderer("control/actions");
this.staticResources = staticResources;
this.messageQueueService = messageQueueService;
Spark.get("/public/heartbeats", (req, res) -> {
res.type("application/json");
return heartbeatService.getServiceHeartbeats();
}, gson::toJson);
Spark.get("/public/", this::overviewModel, indexRenderer::render);
Spark.get("/public/actions", (req,rs) -> new Object() , actionsViewRenderer::render);
Spark.get("/public/events", eventLogService::eventsListModel , eventsRenderer::render);
Spark.get("/public/services/:id", this::serviceModel, serviceByIdRenderer::render);
// Needed to be able to show website screenshots
Spark.get("/public/screenshot/:id", screenshotService::serveScreenshotRequest);
Spark.get("/public/:resource", this::serveStatic);
monitors.subscribe(this::logMonitorStateChange);
}
private Object overviewModel(Request request, Response response) {
return Map.of("processes", heartbeatService.getProcessHeartbeats(),
"nodes", controlNodeService.getNodeStatusList(),
"jobs", heartbeatService.getTaskHeartbeats(),
"services", heartbeatService.getServiceHeartbeats(),
"events", eventLogService.getLastEntries(Long.MAX_VALUE, 20)
);
}
@Override
public void logRequest(Request request) {
if ("GET".equals(request.requestMethod()))
return;
super.logRequest(request);
}
@Override
public void logResponse(Request request, Response response) {
if ("GET".equals(request.requestMethod()))
return;
super.logResponse(request, response);
}
private Object serviceModel(Request request, Response response) {
String serviceName = request.params("id");
return Map.of(
"id", serviceName,
"messages", messageQueueService.getEntriesForInbox(serviceName, Long.MAX_VALUE, 20),
"events", eventLogService.getLastEntriesForService(serviceName, Long.MAX_VALUE, 20));
}
private Object serveStatic(Request request, Response response) {
String resource = request.params("resource");
staticResources.serveStatic("control", resource, request, response);
return "";
}
private void logMonitorStateChange() {
logger.info("Service state change: {}", monitors.getRunningServices());
}
}