All Downloads are FREE. Search and download functionalities are using the official Maven repository.
Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
com.navercorp.pinpoint.inspector.collector.dao.pinot.DefaultAgentStatDao Maven / Gradle / Ivy
/*
* Copyright 2023 NAVER Corp.
*
* Licensed 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 com.navercorp.pinpoint.inspector.collector.dao.pinot;
import com.navercorp.pinpoint.common.dao.pinot.AgentStatTopicNameManager;
import com.navercorp.pinpoint.common.server.bo.stat.AgentStatBo;
import com.navercorp.pinpoint.common.server.bo.stat.AgentStatDataPoint;
import com.navercorp.pinpoint.inspector.collector.config.InspectorCollectorProperties;
import com.navercorp.pinpoint.inspector.collector.dao.AgentStatDao;
import com.navercorp.pinpoint.inspector.collector.model.kafka.AgentStat;
import com.navercorp.pinpoint.inspector.collector.model.kafka.ApplicationStat;
import com.navercorp.pinpoint.pinot.tenant.TenantProvider;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.kafka.core.KafkaTemplate;
import java.time.Duration;
import java.time.Instant;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.function.BiFunction;
import java.util.function.Function;
/**
* @author minwoo.jung
*/
public class DefaultAgentStatDao implements AgentStatDao {
private final Logger logger = LogManager.getLogger(DefaultAgentStatDao.class.getName());
private final Function> dataPointFunction;
private final BiFunction, String, List> convertToKafkaAgentStatModelFunction;
private final Function, List> convertToKafkaApplicationStatModelFunction;
private final KafkaTemplate kafkaAgentStatTemplate;
private final KafkaTemplate kafkaApplicationStatTemplate;
private final int agentStatTopicCount;
private final String applicationStatTopicName;
private final TenantProvider tenantProvider;
private final AgentStatTopicNameManager agentStatTopicNameManager;
public DefaultAgentStatDao(Function> dataPointFunction,
KafkaTemplate kafkaAgentStatTemplate,
KafkaTemplate kafkaApplicationStatTemplate,
BiFunction, String, List> convertToKafkaAgentStatModelFunction,
Function, List> convertToKafkaApplicationStatModelFunction,
InspectorCollectorProperties inspectorCollectorProperties,
TenantProvider tenantProvider) {
this.dataPointFunction = Objects.requireNonNull(dataPointFunction, "dataPointFunction");
this.kafkaAgentStatTemplate = Objects.requireNonNull(kafkaAgentStatTemplate, "kafkaAgentStatTemplate");
this.kafkaApplicationStatTemplate = Objects.requireNonNull(kafkaApplicationStatTemplate, "kafkaApplicationStatTemplate");
this.convertToKafkaAgentStatModelFunction = Objects.requireNonNull(convertToKafkaAgentStatModelFunction, "convertToKafkaAgentStatModelFunction");
this.convertToKafkaApplicationStatModelFunction = Objects.requireNonNull(convertToKafkaApplicationStatModelFunction, "convertToKafkaApplicationStatModelFunction");
Objects.requireNonNull(inspectorCollectorProperties, "inspectorCollectorProperties");
this.agentStatTopicCount = inspectorCollectorProperties.getAgentStatTopicCount();
this.applicationStatTopicName = inspectorCollectorProperties.getApplicationStatTopicName();
this.agentStatTopicNameManager = new AgentStatTopicNameManager(inspectorCollectorProperties.getAgentStatTopicPrefix(), inspectorCollectorProperties.getAgentStatTopicPaddingLength());
this.tenantProvider = Objects.requireNonNull(tenantProvider, "tenantProvider");
}
@Override
public void insert(String applicationName, String agentId, List agentStatData) {
if (!validateTime(agentStatData)) {
return;
};
List agentStatList = convertToKafkaAgentStatModel(agentStatData);
String topicName = agentStatTopicNameManager.getAgentStatTopicName(applicationName, agentStatTopicCount);
for (AgentStat agentStat : agentStatList) {
kafkaAgentStatTemplate.send(topicName, agentStat.getSortKey(), agentStat);
}
List applicationStatList = convertToKafkaApplicationStatModel(agentStatList);
for (ApplicationStat applicationStat : applicationStatList) {
kafkaApplicationStatTemplate.send(applicationStatTopicName, applicationStat.getSortKey(), applicationStat);
}
}
private boolean validateTime(List agentStatData) {
if (agentStatData.isEmpty()) {
return false;
}
T agentStat = agentStatData.get(0);
Instant collectedTime = Instant.ofEpochMilli(agentStat.getTimestamp());
Instant validTime = Instant.now().minus(Duration.ofMinutes(10));
if (validTime.isBefore(collectedTime)) {
return true;
}
logger.info("AgentStat data is invalid. applicationName: {}, agentId: {}, time: {}", agentStat.getApplicationName(), agentStat.getAgentId(), new Date(agentStat.getTimestamp()));
return false;
}
private List convertToKafkaAgentStatModel(List AgentStatDataPointList) {
return convertToKafkaAgentStatModelFunction.apply(AgentStatDataPointList, tenantProvider.getTenantId());
}
private List convertToKafkaApplicationStatModel(List agentStatList) {
return convertToKafkaApplicationStatModelFunction.apply(agentStatList);
}
@Override
public void dispatch(AgentStatBo agentStatBo) {
Objects.requireNonNull(agentStatBo, "agentStatBo");
List dataPointList = this.dataPointFunction.apply(agentStatBo);
insert(agentStatBo.getApplicationName(), agentStatBo.getAgentId(), dataPointList);
}
}