Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[#9254] Collects and retrieves URL statistics using Pinot #9255

Merged
merged 2 commits into from
Oct 21, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ public interface Trace extends StackOperation {
@InterfaceAudience.Private
long getStartTime();

@InterfaceAudience.Private
long getEndTime();
//------------------------------------------------

TraceId getTraceId();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@ public void destroyed(REQ request, final Throwable throwable, final int statusCo
this.traceContext.removeTraceObject();
trace.close();
boolean status = isNotFailedStatus(statusCode);
uriStatRecorder.record(request, rpcName, status, trace.getStartTime(), System.currentTimeMillis());
uriStatRecorder.record(request, rpcName, status, trace.getStartTime(), trace.getEndTime());
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
*/
public class DisabledUriStatRecorder implements UriStatRecorder {

private static final DisabledUriStatRecorder INSTANCE = new DisabledUriStatRecorder();
private static final UriStatRecorder INSTANCE = new DisabledUriStatRecorder();

public static <T> UriStatRecorder<T> create() {
return (UriStatRecorder<T>) INSTANCE;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,18 +26,18 @@
*/
public class UriExtractorChain<T> implements UriExtractor<T> {

private final List<UriExtractor<T>> uriExtractorList;
private final UriExtractor<T>[] uriExtractorList;

public UriExtractorChain(List<UriExtractor<T>> uriExtractorList) {
if (CollectionUtils.isEmpty(uriExtractorList)) {
throw new IllegalArgumentException("uriExtractorList may not be empty");
}
this.uriExtractorList = uriExtractorList;
this.uriExtractorList = uriExtractorList.toArray(new UriExtractor[0]);
}

@Override
public UriExtractorType getExtractorType() {
return uriExtractorList.get(0).getExtractorType();
return uriExtractorList[0].getExtractorType();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,6 @@
*/
public interface UriExtractorProviderLocator {

<T extends UriExtractorProvider> List<T> get(Class<T> type, UriExtractorType uriExtractorType);
<T extends UriExtractorProvider> List<T> getUriExtractorProvider(Class<T> type, UriExtractorType uriExtractorType);

}
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,8 @@ public UriExtractorProviderRegistry(List<UriExtractorProvider> uriExtractorProvi
}

@Override
public <T extends UriExtractorProvider> List<T> get(Class<T> type, UriExtractorType uriExtractorType) {
List<T> result = new ArrayList<T>();
public <T extends UriExtractorProvider> List<T> getUriExtractorProvider(Class<T> type, UriExtractorType uriExtractorType) {
List<T> result = new ArrayList<>();
for (UriExtractorProvider uriExtractorProvider : uriExtractorProviderList) {
if (!type.isInstance(uriExtractorProvider)) {
continue;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,6 @@
*/
public interface UriExtractorService<T> {

UriExtractor<T> get(UriExtractorProviderLocator uriExtractorProviderLocator);
UriExtractor<T> getUriExtractor(UriExtractorProviderLocator uriExtractorProviderLocator);

}
Original file line number Diff line number Diff line change
Expand Up @@ -20,17 +20,18 @@
import com.navercorp.pinpoint.common.util.ArrayUtils;

import java.util.Arrays;
import java.util.Objects;

/**
* @author Taejin Koo
*/
public class UriMappingExtractorProvider implements UriExtractorProvider {

private UriExtractorType uriExtractorType;
private String[] mappingKeyCandidates;
private final UriExtractorType uriExtractorType;
private final String[] mappingKeyCandidates;

public UriMappingExtractorProvider(UriExtractorType uriExtractorType, String[] mappingKeyCandidates) {
this.uriExtractorType = uriExtractorType;
this.uriExtractorType = Objects.requireNonNull(uriExtractorType, "uriExtractorType");

if (ArrayUtils.isEmpty(mappingKeyCandidates)) {
throw new IllegalArgumentException("mappingKeyCandidates may not be empty");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,13 +44,13 @@ public void providerRegistryTest() {


UriExtractorProviderRegistry registry = new UriExtractorProviderRegistry(uriExtractorProviderList);
List<UriMappingExtractorProvider> result = registry.get(UriMappingExtractorProvider.class, UriExtractorType.SERVLET_REQUEST_ATTRIBUTE);
List<UriMappingExtractorProvider> result = registry.getUriExtractorProvider(UriMappingExtractorProvider.class, UriExtractorType.SERVLET_REQUEST_ATTRIBUTE);
Assertions.assertEquals(2, result.size());

result = registry.get(UriMappingExtractorProvider.class, UriExtractorType.NONE);
result = registry.getUriExtractorProvider(UriMappingExtractorProvider.class, UriExtractorType.NONE);
Assertions.assertEquals(0, result.size());

List<MockUriExtractorProvider> result2 = registry.get(MockUriExtractorProvider.class, UriExtractorType.SERVLET_REQUEST_ATTRIBUTE);
List<MockUriExtractorProvider> result2 = registry.getUriExtractorProvider(MockUriExtractorProvider.class, UriExtractorType.SERVLET_REQUEST_ATTRIBUTE);
Assertions.assertEquals(0, result2.size());
}

Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -39,15 +39,14 @@ public AgentUriStatBo map(final PAgentUriStat agentUriStat) {
final Header agentInfo = ServerContext.getAgentInfo();

final String agentId = agentInfo.getAgentId();
final long startTimestamp = agentInfo.getAgentStartTime();
final String applicationName = agentInfo.getApplicationName();

long timestamp = agentUriStat.getTimestamp();
int bucketVersion = agentUriStat.getBucketVersion();

AgentUriStatBo agentUriStatBo = new AgentUriStatBo();
agentUriStatBo.setServiceName(""); // TODO: add serviceName when available
agentUriStatBo.setApplicationName(applicationName);
agentUriStatBo.setAgentId(agentId);
agentUriStatBo.setStartTimestamp(startTimestamp);
agentUriStatBo.setTimestamp(timestamp);
agentUriStatBo.setBucketVersion((byte) bucketVersion);

List<PEachUriStat> eachUriStatList = agentUriStat.getEachUriStatList();
Expand All @@ -73,6 +72,8 @@ private EachUriStatBo createEachUriStatBo(PEachUriStat pEachUriStat) {
final UriStatHistogram failedHistogram = convertUriStatHistogram(pFailedHistogram);
eachUriStatBo.setFailedHistogram(failedHistogram);

eachUriStatBo.setTimestamp(pEachUriStat.getTimestamp());

return eachUriStatBo;
}

Expand All @@ -82,7 +83,7 @@ private UriStatHistogram convertUriStatHistogram(PUriHistogram pUriHistogram) {
return null;
}

double avg = pUriHistogram.getAvg();
long total = pUriHistogram.getTotal();
long max = pUriHistogram.getMax();

int histogramCount = pUriHistogram.getHistogramCount();
Expand All @@ -95,7 +96,7 @@ private UriStatHistogram convertUriStatHistogram(PUriHistogram pUriHistogram) {

UriStatHistogram uriStatHistogram = new UriStatHistogram();
uriStatHistogram.setCount(count);
uriStatHistogram.setAvg(avg);
uriStatHistogram.setTotal(total);
uriStatHistogram.setMax(max);
uriStatHistogram.setTimestampHistogram(histogram);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,28 +16,17 @@

package com.navercorp.pinpoint.collector.service;

import com.navercorp.pinpoint.collector.dao.hbase.HbaseAgentUriStatDao;
import com.navercorp.pinpoint.common.server.bo.stat.AgentUriStatBo;

import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.stereotype.Service;

import java.util.Objects;

/**
* @author Taejin Koo
*/
@Service("hBaseAgentUriStatService")
public class HBaseAgentUriStatService implements AgentUriStatService {

private final HbaseAgentUriStatDao hbaseAgentUriStatDao;

public HBaseAgentUriStatService(HbaseAgentUriStatDao hbaseAgentUriStatDao) {
this.hbaseAgentUriStatDao = Objects.requireNonNull(hbaseAgentUriStatDao, "hbaseAgentUriStatDao");
}

@ConditionalOnMissingBean(value = AgentUriStatService.class, ignored = EmptyAgentUriStatService.class)
@Service
public class EmptyAgentUriStatService implements AgentUriStatService {
@Override
public void save(AgentUriStatBo agentUriStatBo) {
hbaseAgentUriStatDao.insert(agentUriStatBo);
}

public void save(AgentUriStatBo agentUriStatBo) {}
}
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ private PAgentUriStat createPAgentUriStat() {
PUriHistogram.Builder histogramBuilder = PUriHistogram.newBuilder();

int totalCount = 0;
for (int i = 0; i < UriStatHistogramBucket.getBucketSize(); i++) {
for (int i = 0; i < UriStatHistogramBucket.getLayout().getBucketSize(); i++) {
int count = ThreadLocalRandom.current().nextInt(0, 10);
totalCount += count;

Expand All @@ -123,10 +123,10 @@ private PAgentUriStat createPAgentUriStat() {
PEachUriStat.Builder eachUriStatBuilder = PEachUriStat.newBuilder();
eachUriStatBuilder.setUri("uri");
eachUriStatBuilder.setTotalHistogram(histogramBuilder.build());
eachUriStatBuilder.setTimestamp(System.currentTimeMillis());

PAgentUriStat.Builder builder = PAgentUriStat.newBuilder();
builder.setBucketVersion(0);
builder.setTimestamp(System.currentTimeMillis());
builder.addEachUriStat(eachUriStatBuilder.build());

return builder.build();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -162,16 +162,4 @@ public AgentStatDecoder<TransactionBo> getAgentTransactionDecoder(List<AgentStat
public AgentStatEncoder<TransactionBo> getAgentTransactionEncoder(AgentStatCodec<TransactionBo> codec) {
return new AgentStatEncoder<>(codec);
}

// ----------------

@Bean
public AgentStatDecoder<AgentUriStatBo> getAgentAgentUriStatDecoder(List<AgentStatCodec<AgentUriStatBo>> codecs) {
return new AgentStatDecoder<>(codecs);
}

@Bean
public AgentStatEncoder<AgentUriStatBo> getAgentAgentUriStatEncoder(AgentStatCodec<AgentUriStatBo> codec) {
return new AgentStatEncoder<>(codec);
}
}
Loading