Skip to content

Commit f22fa42

Browse files
authored
DPL: add DataTakingSupport plugin (#10019)
This is to avoid linking directly against InfoLogger.
1 parent 9699b7f commit f22fa42

9 files changed

Lines changed: 221 additions & 166 deletions

File tree

Framework/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ add_subdirectory(Utils)
1919

2020
add_subdirectory(AnalysisSupport)
2121
add_subdirectory(PhysicsSupport)
22+
add_subdirectory(DataTakingSupport)
2223

2324
add_subdirectory(RootAnalysisHelpers)
2425

Framework/Core/CMakeLists.txt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,6 @@ o2_add_library(Framework
140140
test/TestClasses.cxx
141141
PRIVATE_INCLUDE_DIRECTORIES ${CMAKE_CURRENT_LIST_DIR}/src
142142
PUBLIC_LINK_LIBRARIES AliceO2::Configuration
143-
AliceO2::InfoLogger
144143
AliceO2::Monitoring
145144
CURL::libcurl
146145
FairMQ::FairMQ
@@ -205,7 +204,6 @@ foreach(t
205204
HistogramRegistry
206205
HTTPParser
207206
IndexBuilder
208-
InfoLogger
209207
InputRecord
210208
InputRecordWalker
211209
InputSpan
@@ -248,6 +246,12 @@ o2_add_test(Root2ArrowTable NAME test_Framework_test_Root2ArrowTable
248246
LABELS framework
249247
PUBLIC_LINK_LIBRARIES O2::Framework ROOT::ROOTDataFrame)
250248

249+
o2_add_test(InfoLogger NAME test_Framework_test_InfoLogger
250+
SOURCES test/test_InfoLogger.cxx
251+
COMPONENT_NAME Framework
252+
LABELS framework
253+
PUBLIC_LINK_LIBRARIES O2::Framework AliceO2::InfoLogger)
254+
251255
o2_add_executable(dpl-null-sink
252256
SOURCES src/o2NullSink.cxx
253257
PUBLIC_LINK_LIBRARIES O2::Framework

Framework/Core/include/Framework/CommonServices.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,6 @@ struct CommonServices {
5353
static ServiceSpec driverClientSpec();
5454
static ServiceSpec monitoringSpec();
5555
static ServiceSpec datatakingContextSpec();
56-
static ServiceSpec infologgerContextSpec();
57-
static ServiceSpec infologgerSpec();
5856
static ServiceSpec configurationSpec();
5957
static ServiceSpec controlSpec();
6058
static ServiceSpec rootFileSpec();

Framework/Core/src/CommonServices.cxx

Lines changed: 5 additions & 158 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@
4848
#include <Configuration/ConfigurationInterface.h>
4949
#include <Configuration/ConfigurationFactory.h>
5050
#include <Monitoring/MonitoringFactory.h>
51-
#include <InfoLogger/InfoLogger.hxx>
5251

5352
#include <fairmq/Device.h>
5453
#include <fairmq/shmem/Monitor.h>
@@ -59,8 +58,6 @@
5958
#include <cstdlib>
6059
#include <cstring>
6160

62-
using AliceO2::InfoLogger::InfoLogger;
63-
using AliceO2::InfoLogger::InfoLoggerContext;
6461
using o2::configuration::ConfigurationFactory;
6562
using o2::configuration::ConfigurationInterface;
6663
using o2::monitoring::Monitoring;
@@ -76,12 +73,6 @@ using Value = o2::monitoring::tags::Value;
7673
namespace o2::framework
7774
{
7875

79-
/// This is a global service because read only
80-
template <>
81-
struct ServiceKindExtractor<InfoLoggerContext> {
82-
constexpr static ServiceKind kind = ServiceKind::Global;
83-
};
84-
8576
#define MONITORING_QUEUE_SIZE 100
8677
o2::framework::ServiceSpec CommonServices::monitoringSpec()
8778
{
@@ -200,154 +191,9 @@ o2::framework::ServiceSpec CommonServices::datatakingContextSpec()
200191
.kind = ServiceKind::Serial};
201192
}
202193

203-
o2::framework::ServiceSpec CommonServices::infologgerContextSpec()
204-
{
205-
return ServiceSpec{
206-
.name = "infologger-contex",
207-
.init = simpleServiceInit<InfoLoggerContext, InfoLoggerContext>(),
208-
.configure = noConfiguration(),
209-
.start = [](ServiceRegistry& services, void* service) {
210-
auto& infoLoggerContext = services.get<InfoLoggerContext>();
211-
auto run = services.get<RawDeviceService>().device()->fConfig->GetProperty<std::string>("runNumber", "unspecified");
212-
infoLoggerContext.setField(InfoLoggerContext::FieldName::Run, run);
213-
auto partition = services.get<RawDeviceService>().device()->fConfig->GetProperty<std::string>("environment_id", "unspecified");
214-
infoLoggerContext.setField(InfoLoggerContext::FieldName::Partition, partition);
215-
},
216-
.kind = ServiceKind::Serial};
217-
}
218-
219-
// Creates the sink for FairLogger / InfoLogger integration
220-
auto createInfoLoggerSinkHelper(InfoLogger* logger, InfoLoggerContext* ctx)
221-
{
222-
return [logger,
223-
ctx](const std::string& content, const fair::LogMetaData& metadata) {
224-
// translate FMQ metadata
225-
InfoLogger::InfoLogger::Severity severity = InfoLogger::Severity::Undefined;
226-
int level = InfoLogger::undefinedMessageOption.level;
227-
228-
if (metadata.severity_name == fair::Logger::SeverityName(fair::Severity::nolog)) {
229-
// discard
230-
return;
231-
} else if (metadata.severity_name == fair::Logger::SeverityName(fair::Severity::fatal)) {
232-
severity = InfoLogger::Severity::Fatal;
233-
level = 1;
234-
} else if (metadata.severity_name == fair::Logger::SeverityName(fair::Severity::error)) {
235-
severity = InfoLogger::Severity::Error;
236-
level = 3;
237-
} else if (metadata.severity_name == fair::Logger::SeverityName(fair::Severity::alarm)) {
238-
severity = InfoLogger::Severity::Warning;
239-
level = 4;
240-
} else if (metadata.severity_name == fair::Logger::SeverityName(fair::Severity::important)) {
241-
severity = InfoLogger::Severity::Info;
242-
level = 5;
243-
} else if (metadata.severity_name == fair::Logger::SeverityName(fair::Severity::warn)) {
244-
severity = InfoLogger::Severity::Warning;
245-
level = 6;
246-
} else if (metadata.severity_name == fair::Logger::SeverityName(fair::Severity::state)) {
247-
severity = InfoLogger::Severity::Info;
248-
level = 8;
249-
} else if (metadata.severity_name == fair::Logger::SeverityName(fair::Severity::info)) {
250-
severity = InfoLogger::Severity::Info;
251-
level = 10;
252-
} else if (metadata.severity_name == fair::Logger::SeverityName(fair::Severity::debug)) {
253-
severity = InfoLogger::Severity::Debug;
254-
level = 11;
255-
} else if (metadata.severity_name == fair::Logger::SeverityName(fair::Severity::debug1)) {
256-
severity = InfoLogger::Severity::Debug;
257-
level = 12;
258-
} else if (metadata.severity_name == fair::Logger::SeverityName(fair::Severity::debug2)) {
259-
severity = InfoLogger::Severity::Debug;
260-
level = 13;
261-
} else if (metadata.severity_name == fair::Logger::SeverityName(fair::Severity::debug3)) {
262-
severity = InfoLogger::Severity::Debug;
263-
level = 14;
264-
} else if (metadata.severity_name == fair::Logger::SeverityName(fair::Severity::debug4)) {
265-
severity = InfoLogger::Severity::Debug;
266-
level = 15;
267-
} else if (metadata.severity_name == fair::Logger::SeverityName(fair::Severity::trace)) {
268-
severity = InfoLogger::Severity::Debug;
269-
level = 50;
270-
}
271-
272-
InfoLogger::InfoLoggerMessageOption opt = {
273-
severity,
274-
level,
275-
InfoLogger::undefinedMessageOption.errorCode,
276-
metadata.file.c_str(),
277-
atoi(metadata.line.c_str())};
278-
279-
if (logger) {
280-
logger->log(opt, *ctx, "%s", content.c_str());
281-
}
282-
};
283-
};
284-
285194
struct MissingService {
286195
};
287196

288-
o2::framework::ServiceSpec CommonServices::infologgerSpec()
289-
{
290-
return ServiceSpec{
291-
.name = "infologger",
292-
.init = [](ServiceRegistry& services, DeviceState&, fair::mq::ProgOptions& options) -> ServiceHandle {
293-
auto infoLoggerMode = options.GetPropertyAsString("infologger-mode");
294-
auto infoLoggerSeverity = options.GetPropertyAsString("infologger-severity");
295-
if (infoLoggerSeverity.empty() == false && options.GetPropertyAsString("infologger-mode") == "") {
296-
LOGP(info, "Using O2_INFOLOGGER_MODE=infoLoggerD since infologger-severity is set");
297-
infoLoggerMode = "infoLoggerD";
298-
}
299-
if (infoLoggerMode != "") {
300-
setenv("O2_INFOLOGGER_MODE", infoLoggerMode.c_str(), 1);
301-
}
302-
char const* infoLoggerEnv = getenv("O2_INFOLOGGER_MODE");
303-
if (infoLoggerEnv == nullptr || strcmp(infoLoggerEnv, "none") == 0) {
304-
return ServiceHandle{.hash = TypeIdHelpers::uniqueId<MissingService>(),
305-
.instance = nullptr,
306-
.kind = ServiceKind::Serial,
307-
.name = "infologger"};
308-
}
309-
InfoLogger* infoLoggerService = nullptr;
310-
try {
311-
infoLoggerService = new InfoLogger;
312-
} catch (...) {
313-
LOGP(error, "Unable to initialise InfoLogger with O2_INFOLOGGER_MODE={}.", infoLoggerMode);
314-
return ServiceHandle{.hash = TypeIdHelpers::uniqueId<MissingService>(),
315-
.instance = nullptr,
316-
.kind = ServiceKind::Serial,
317-
.name = "infologger"};
318-
}
319-
auto infoLoggerContext = &services.get<InfoLoggerContext>();
320-
// Only print the first 10 characters and the last 18 if the
321-
// string length is greater than 32 bytes.
322-
auto truncate = [](std::string in) -> std::string {
323-
if (in.size() < 32) {
324-
return in;
325-
}
326-
char name[32];
327-
memcpy(name, in.data(), 10);
328-
name[10] = '.';
329-
name[11] = '.';
330-
name[12] = '.';
331-
memcpy(name + 13, in.data() + in.size() - 18, 18);
332-
name[31] = 0;
333-
return name;
334-
};
335-
infoLoggerContext->setField(InfoLoggerContext::FieldName::Facility, truncate(services.get<DeviceSpec const>().name));
336-
infoLoggerContext->setField(InfoLoggerContext::FieldName::System, std::string("DPL"));
337-
infoLoggerService->setContext(*infoLoggerContext);
338-
339-
if (infoLoggerSeverity != "") {
340-
fair::Logger::AddCustomSink("infologger", infoLoggerSeverity, createInfoLoggerSinkHelper(infoLoggerService, infoLoggerContext));
341-
}
342-
return ServiceHandle{.hash = TypeIdHelpers::uniqueId<InfoLogger>(),
343-
.instance = infoLoggerService,
344-
.kind = ServiceKind::Serial,
345-
.name = "infologger"};
346-
},
347-
.configure = noConfiguration(),
348-
.kind = ServiceKind::Serial};
349-
}
350-
351197
o2::framework::ServiceSpec CommonServices::configurationSpec()
352198
{
353199
return ServiceSpec{
@@ -917,8 +763,6 @@ std::vector<ServiceSpec> CommonServices::defaultServices(int numThreads)
917763
driverClientSpec(),
918764
datatakingContextSpec(),
919765
monitoringSpec(),
920-
infologgerContextSpec(),
921-
infologgerSpec(),
922766
configurationSpec(),
923767
controlSpec(),
924768
rootFileSpec(),
@@ -936,16 +780,19 @@ std::vector<ServiceSpec> CommonServices::defaultServices(int numThreads)
936780
decongestionSpec(),
937781
CommonMessageBackends::rawBufferBackendSpec()};
938782

783+
std::string loadableServicesStr = "O2FrameworkDataTakingSupport:InfoLoggerContext,O2FrameworkDataTakingSupport:InfoLogger";
939784
// Load plugins depending on the environment
940785
std::vector<LoadableService> loadableServices = {};
941786
char* loadableServicesEnv = getenv("DPL_LOAD_SERVICES");
942787
// String to define the services to load is:
943788
//
944789
// library1:name1,library2:name2,...
945790
if (loadableServicesEnv) {
946-
loadableServices = ServiceHelpers::parseServiceSpecString(loadableServicesEnv);
947-
ServiceHelpers::loadFromPlugin(loadableServices, specs);
791+
loadableServicesStr += ",";
792+
loadableServicesStr += loadableServicesEnv;
948793
}
794+
loadableServices = ServiceHelpers::parseServiceSpecString(loadableServicesStr.c_str());
795+
ServiceHelpers::loadFromPlugin(loadableServices, specs);
949796
// I should make it optional depending wether the GUI is there or not...
950797
specs.push_back(CommonServices::guiMetricsSpec());
951798
if (numThreads) {

Framework/Core/src/runDataProcessing.cxx

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,6 @@
7373
#include <Configuration/ConfigurationInterface.h>
7474
#include <Configuration/ConfigurationFactory.h>
7575
#include <Monitoring/MonitoringFactory.h>
76-
#include <InfoLogger/InfoLogger.hxx>
7776
#include "ResourcesMonitoringHelper.h"
7877

7978
#include <fairmq/Device.h>
@@ -146,7 +145,6 @@
146145

147146
using namespace o2::monitoring;
148147
using namespace o2::configuration;
149-
using namespace AliceO2::InfoLogger;
150148

151149
using namespace o2::framework;
152150
namespace bpo = boost::program_options;

Framework/Core/test/test_SlowConsumer.cxx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
#include "Framework/RawDeviceService.h"
1515
#include "Framework/ControlService.h"
1616
#include <fairmq/Device.h>
17-
#include <InfoLogger/InfoLogger.hxx>
1817

1918
#include <chrono>
2019
#include <thread>
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
# Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2+
# See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3+
# All rights not expressly granted are reserved.
4+
#
5+
# This software is distributed under the terms of the GNU General Public
6+
# License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7+
#
8+
# In applying this license CERN does not waive the privileges and immunities
9+
# granted to it by virtue of its status as an Intergovernmental Organization
10+
# or submit itself to any jurisdiction.
11+
o2_add_library(FrameworkDataTakingSupport
12+
SOURCES src/Plugin.cxx
13+
PRIVATE_INCLUDE_DIRECTORIES ${CMAKE_CURRENT_LIST_DIR}/src
14+
PUBLIC_LINK_LIBRARIES O2::Framework AliceO2::InfoLogger)

0 commit comments

Comments
 (0)