blob: 5698cfbc16fab8e3f452ed76f14a13abbe1106fa [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.skywalking.oap.server.core.command;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
import java.util.stream.Collectors;
import com.google.gson.Gson;
import org.apache.skywalking.oap.server.core.analysis.IDManager;
import org.apache.skywalking.oap.server.core.profiling.continuous.storage.ContinuousProfilingPolicy;
import org.apache.skywalking.oap.server.core.profiling.continuous.storage.ContinuousProfilingPolicyConfiguration;
import org.apache.skywalking.oap.server.core.profiling.ebpf.storage.EBPFProfilingTargetType;
import org.apache.skywalking.oap.server.core.profiling.ebpf.storage.EBPFProfilingTaskRecord;
import org.apache.skywalking.oap.server.core.profiling.ebpf.storage.EBPFProfilingTriggerType;
import org.apache.skywalking.oap.server.core.query.type.EBPFProfilingTaskExtension;
import org.apache.skywalking.oap.server.library.util.CollectionUtils;
import org.apache.skywalking.oap.server.library.util.StringUtil;
import org.apache.skywalking.oap.server.network.trace.component.command.ContinuousProfilingReportCommand;
import org.apache.skywalking.oap.server.network.trace.component.command.ContinuousProfilingPolicyCommand;
import org.apache.skywalking.oap.server.network.trace.component.command.EBPFProfilingTaskCommand;
import org.apache.skywalking.oap.server.network.trace.component.command.EBPFProfilingTaskExtensionConfig;
import org.apache.skywalking.oap.server.network.trace.component.command.ProfileTaskCommand;
import org.apache.skywalking.oap.server.core.query.type.ProfileTask;
import org.apache.skywalking.oap.server.library.module.ModuleManager;
import org.apache.skywalking.oap.server.library.module.Service;
/**
* CommandService represents the command creation factory. All commands for downstream agents should be created here.
*/
public class CommandService implements Service {
private static final Gson GSON = new Gson();
private final ModuleManager moduleManager;
public CommandService(final ModuleManager moduleManager) {
this.moduleManager = moduleManager;
}
public ProfileTaskCommand newProfileTaskCommand(ProfileTask task) {
final String serialNumber = UUID.randomUUID().toString();
return new ProfileTaskCommand(
serialNumber, task.getId(), task.getEndpointName(), task.getDuration(), task.getMinDurationThreshold(), task
.getDumpPeriod(), task.getMaxSamplingCount(), task.getStartTime(), task.getCreateTime());
}
/**
* Used to notify the eBPF Profiling task to the eBPF agent side
*/
public EBPFProfilingTaskCommand newEBPFProfilingTaskCommand(EBPFProfilingTaskRecord task, List<String> processId) {
final String serialNumber = UUID.randomUUID().toString();
EBPFProfilingTaskCommand.FixedTrigger fixedTrigger = null;
if (Objects.equals(task.getTriggerType(), EBPFProfilingTriggerType.FIXED_TIME.value())) {
fixedTrigger = new EBPFProfilingTaskCommand.FixedTrigger(task.getFixedTriggerDuration());
}
return new EBPFProfilingTaskCommand(serialNumber, task.getLogicalId(), processId, task.getStartTime(),
task.getLastUpdateTime(), EBPFProfilingTriggerType.valueOf(task.getTriggerType()).name(), fixedTrigger,
EBPFProfilingTargetType.valueOf(task.getTargetType()).name(),
convertExtension(task));
}
public ContinuousProfilingPolicyCommand newContinuousProfilingServicePolicyCommand(List<ContinuousProfilingPolicy> policy) {
return new ContinuousProfilingPolicyCommand(UUID.randomUUID().toString(),
policy.stream().map(this::convertContinuesProfilingPolicy).collect(Collectors.toList()));
}
public ContinuousProfilingReportCommand newContinuousProfilingReportCommand(String taskId) {
return new ContinuousProfilingReportCommand(UUID.randomUUID().toString(), taskId);
}
private org.apache.skywalking.oap.server.network.trace.component.command.ContinuousProfilingPolicy convertContinuesProfilingPolicy(ContinuousProfilingPolicy policy) {
final org.apache.skywalking.oap.server.network.trace.component.command.ContinuousProfilingPolicy result = new org.apache.skywalking.oap.server.network.trace.component.command.ContinuousProfilingPolicy();
result.setServiceName(IDManager.ServiceID.analysisId(policy.getServiceId()).getName());
result.setUuid(policy.getUuid());
if (StringUtil.isNotEmpty(policy.getConfigurationJson())) {
final ContinuousProfilingPolicyConfiguration configuration = ContinuousProfilingPolicyConfiguration.parseFromJSON(policy.getConfigurationJson());
result.setProfiling(configuration.getTargetCheckers().entrySet().stream().collect(Collectors.toMap(
c -> c.getKey().name(),
c -> c.getValue().entrySet().stream().collect(Collectors.toMap(i -> i.getKey().name(), i -> {
final org.apache.skywalking.oap.server.network.trace.component.command.ContinuousProfilingPolicy.Item item = new org.apache.skywalking.oap.server.network.trace.component.command.ContinuousProfilingPolicy.Item();
item.setThreshold(i.getValue().getThreshold());
item.setPeriod(i.getValue().getPeriod());
item.setCount(i.getValue().getCount());
item.setUriList(i.getValue().getUriList());
item.setUriRegex(i.getValue().getUriRegex());
return item;
}
)))));
}
return result;
}
private EBPFProfilingTaskExtensionConfig convertExtension(EBPFProfilingTaskRecord task) {
if (StringUtil.isEmpty(task.getExtensionConfigJson())) {
return null;
}
EBPFProfilingTaskExtension extensionConfig = GSON.fromJson(task.getExtensionConfigJson(), EBPFProfilingTaskExtension.class);
if (CollectionUtils.isEmpty(extensionConfig.getNetworkSamplings())) {
return null;
}
EBPFProfilingTaskExtensionConfig config = new EBPFProfilingTaskExtensionConfig();
config.setNetworkSamplings(extensionConfig.getNetworkSamplings().stream().map(s -> {
return EBPFProfilingTaskExtensionConfig.NetworkSamplingRule.builder()
.uriRegex(s.getUriRegex())
.minDuration(s.getMinDuration())
.when4xx(s.isWhen5xx())
.when5xx(s.isWhen5xx())
.settings(EBPFProfilingTaskExtensionConfig.CollectSettings.builder()
.requireCompleteRequest(s.getSettings().isRequireCompleteRequest())
.maxRequestSize(s.getSettings().getMaxRequestSize())
.requireCompleteResponse(s.getSettings().isRequireCompleteResponse())
.maxResponseSize(s.getSettings().getMaxResponseSize())
.build())
.build();
}).collect(Collectors.toList()));
return config;
}
}