Skip to content

Commit

Permalink
WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
stoty committed Nov 17, 2023
1 parent edd918a commit 12b9664
Show file tree
Hide file tree
Showing 9 changed files with 399 additions and 58 deletions.
4 changes: 4 additions & 0 deletions phoenix-client-parent/phoenix-client-embedded/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,10 @@
<artifactId>phoenix-hbase-compat-${hbase.compat.version}</artifactId>
<optional>false</optional>
</dependency>
<dependency>
<groupId>org.apache.phoenix</groupId>
<artifactId>phoenix-opentelemetry-trace-sampler</artifactId>
</dependency>
<!-- Exclude servlet and Jetty. We don't need it, and it causes problems with minicluster -->
<dependency>
<groupId>org.eclipse.jetty</groupId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,8 @@
import org.apache.phoenix.util.PhoenixKeyValueUtil;
import org.apache.phoenix.util.SizedUtil;

import io.opentelemetry.api.trace.Span;

public class TraceQueryPlan implements QueryPlan {

private TraceStatement traceStatement = null;
Expand Down Expand Up @@ -124,11 +126,11 @@ public ResultIterator iterator(ParallelScanGrouper scanGrouper, Scan scan) throw

@Override
public ResultIterator iterator(ParallelScanGrouper scanGrouper) throws SQLException {
// final PhoenixConnection conn = stmt.getConnection();
// if (conn.getTraceScope() == null && !traceStatement.isTraceOn()) {
final PhoenixConnection conn = stmt.getConnection();
if (conn.getTraceSpan() == null && !traceStatement.isTraceOn()) {
return ResultIterator.EMPTY_ITERATOR;
// }
// return new TraceQueryResultIterator(conn);
}
return new TraceQueryResultIterator(conn);
}

@Override
Expand Down Expand Up @@ -255,53 +257,37 @@ public void close() throws SQLException {

@Override
public Tuple next() throws SQLException {
return null;
// if(!first) return null;
// TraceScope traceScope = conn.getTraceScope();
// if (traceStatement.isTraceOn()) {
// conn.setSampler(Tracing.getConfiguredSampler(traceStatement));
// if (conn.getSampler() == Sampler.NEVER) {
// closeTraceScope(conn);
// }
// if (traceScope == null && !conn.getSampler().equals(Sampler.NEVER)) {
// traceScope = Tracing.startNewSpan(conn, "Enabling trace");
// if (traceScope.getSpan() != null) {
// conn.setTraceScope(traceScope);
// } else {
// closeTraceScope(conn);
// }
// }
// } else {
// closeTraceScope(conn);
// conn.setSampler(Sampler.NEVER);
// }
// if (traceScope == null || traceScope.getSpan() == null) return null;
// first = false;
// ImmutableBytesWritable ptr = new ImmutableBytesWritable();
// ParseNodeFactory factory = new ParseNodeFactory();
// LiteralParseNode literal =
// factory.literal(traceScope.getSpan().getTraceId());
// LiteralExpression expression =
// LiteralExpression.newConstant(literal.getValue(), PLong.INSTANCE,
// Determinism.ALWAYS);
// expression.evaluate(null, ptr);
// byte[] rowKey = ByteUtil.copyKeyBytesIfNecessary(ptr);
// Cell cell =
// PhoenixKeyValueUtil
// .newKeyValue(rowKey, HConstants.EMPTY_BYTE_ARRAY,
// HConstants.EMPTY_BYTE_ARRAY,
// EnvironmentEdgeManager.currentTimeMillis(),
// HConstants.EMPTY_BYTE_ARRAY);
// List<Cell> cells = new ArrayList<Cell>(1);
// cells.add(cell);
// return new ResultTuple(Result.create(cells));
}

private void closeTraceScope(final PhoenixConnection conn) {
// if(conn.getTraceScope()!=null) {
// conn.getTraceScope().close();
// conn.setTraceScope(null);
// }
if (!first) {
return null;
}
if (traceStatement.isTraceOn()) {
conn.startManualTraceSpan();
} else {
conn.endManualTraceSpan();
}
first = false;
String traceSpanId = connection.getManualTraceSpanId();
if (traceSpanId != null) {
ImmutableBytesWritable ptr = new ImmutableBytesWritable();
ParseNodeFactory factory = new ParseNodeFactory();
LiteralParseNode literal = factory.literal(traceSpanId);
LiteralExpression expression =
LiteralExpression.newConstant(literal.getValue(), PLong.INSTANCE,
Determinism.ALWAYS);
expression.evaluate(null, ptr);
byte[] rowKey = ByteUtil.copyKeyBytesIfNecessary(ptr);
Cell cell =
PhoenixKeyValueUtil
.newKeyValue(rowKey, HConstants.EMPTY_BYTE_ARRAY,
HConstants.EMPTY_BYTE_ARRAY,
EnvironmentEdgeManager.currentTimeMillis(),
HConstants.EMPTY_BYTE_ARRAY);
List<Cell> cells = new ArrayList<Cell>(1);
cells.add(cell);
return new ResultTuple(Result.create(cells));
} else {
return null;
}
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,7 @@ public class PhoenixConnection implements MetaDataMutated, SQLCloseable, Phoenix
private final String timePattern;
private final String timestampPattern;
private int statementExecutionCounter;
private Span traceSpan;
private Span manualTraceSpan = TraceUtil.cr;
private volatile boolean isClosed = false;
private volatile boolean isClosing = false;
private boolean readOnly = false;
Expand Down Expand Up @@ -210,6 +210,7 @@ private static Properties newPropsWithSCN(long scn, Properties props) {
return props;
}

//TODO handle active Tracing span for copy constructors
public PhoenixConnection(PhoenixConnection connection,
boolean isDescRowKeyOrderUpgrade, boolean isRunningUpgrade)
throws SQLException {
Expand Down Expand Up @@ -479,6 +480,7 @@ public boolean isInternalConnection() {
* @param connection
*/
public void addChildConnection(PhoenixConnection connection) {
//TODO handle trace pan
childConnections.add(connection);
}

Expand All @@ -488,6 +490,7 @@ public void addChildConnection(PhoenixConnection connection) {
* @param connection
*/
public void removeChildConnection(PhoenixConnection connection) {
//TODO handle trace pan
childConnections.remove(connection);
}

Expand Down Expand Up @@ -771,8 +774,8 @@ synchronized public void close() throws SQLException {
clearMetrics();
}
try {
if (traceSpan != null) {
traceSpan.end();
if (manualTraceSpan != null) {
manualTraceSpan.end();
}
closeStatements();
if (childConnections != null) {
Expand Down Expand Up @@ -1338,11 +1341,11 @@ public void incrementStatementExecutionCounter() {
}

public Span getTraceSpan() {
return traceSpan;
return manualTraceSpan;
}

public void setTraceSpan(Span traceSpan) {
this.traceSpan = traceSpan;
this.manualTraceSpan = traceSpan;
}

@Override
Expand Down Expand Up @@ -1479,4 +1482,11 @@ public ConnectionActivityLogger getActivityLogger() {
public void setActivityLogger(ConnectionActivityLogger connectionActivityLogger) {
this.connectionActivityLogger = connectionActivityLogger;
}

public void startManualTraceSpan() {
if (manualTraceSpan != null) {
return;
}
manualTraceSpan = TraceUtil.createSpan(null, dateFormatTimeZoneId, true);
}
}
16 changes: 14 additions & 2 deletions phoenix-core/src/main/java/org/apache/phoenix/trace/TraceUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,9 @@ private static SpanBuilder createPhoenixSpanBuilder(String name) {
}

private static SpanBuilder setFromConnection(SpanBuilder builder, PhoenixConnection conn) {

GlobalOpenTelemetry.getTracer("org.apache.phoenix", "0.0.1").spanBuilder("null")

builder.setAttribute(DB_CONNECTION_STRING, conn.getURL());
try {
builder.setAttribute(DB_USER, UserGroupInformation.getCurrentUser().getShortUserName());
Expand All @@ -86,10 +89,14 @@ private static SpanBuilder setFromConnection(SpanBuilder builder, PhoenixConnect
* use this with caution when you want to create spans with kind other than
* {@link SpanKind#INTERNAL}.
*/
public static Span createSpan(PhoenixConnection conn, String name, SpanKind kind) {
public static Span createSpan(PhoenixConnection conn, String name, SpanKind kind, boolean hinted) {
SpanBuilder builder = createPhoenixSpanBuilder(name);
builder = setFromConnection(builder, conn);
builder.setSpanKind(kind);
if (hinted) {
// Only has an effect if PhoenixHintableSampler is used
builder.setAttribute("sampling.priority", 1L);
}
//FIXME only for debugging. Maybe add a property for runtime ?
StringBuilder sb = new StringBuilder();
for (StackTraceElement st : Thread.currentThread().getStackTrace()) {
Expand All @@ -99,10 +106,15 @@ public static Span createSpan(PhoenixConnection conn, String name, SpanKind kind
return builder.startSpan();
}

public static Span createSpan(PhoenixConnection conn, String name, boolean hinted) {
return createSpan(conn, name, SpanKind.INTERNAL, hinted);
}

public static Span createSpan(PhoenixConnection conn, String name) {
return createSpan(conn, name, SpanKind.INTERNAL);
return createSpan(conn, name, SpanKind.INTERNAL, false);
}


/**
* Create a span without the information taken from Connection.
* This is to be used in the server side code.
Expand Down
123 changes: 123 additions & 0 deletions phoenix-opentelemetry-trace-sampler/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
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.
-->
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.apache.phoenix</groupId>
<artifactId>phoenix</artifactId>
<version>5.2.0-SNAPSHOT</version>
</parent>

<artifactId>phoenix-opentelemetry-trace-sampler</artifactId>
<packaging>jar</packaging>
<name>Phoenix Opentelemetry Trace Sampler</name>

<properties>

<jacoco.instruction.coverage.percentage>0.650</jacoco.instruction.coverage.percentage>
<jacoco.branch.coverage.percentage>0.500</jacoco.branch.coverage.percentage>
</properties>

<dependencies>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-sdk</artifactId>
</dependency>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-sdk-extension-autoconfigure</artifactId>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
</plugin>
<!-- <plugin>-->
<!-- <artifactId>maven-dependency-plugin</artifactId>-->
<!-- <configuration>-->
<!-- <ignoredUnusedDeclaredDependencies>-->
<!-- <ignoredUnusedDeclaredDependency>-->
<!-- org.apache.hbase.thirdparty:hbase-shaded-miscellaneous-->
<!-- </ignoredUnusedDeclaredDependency>-->
<!-- <ignoredUnusedDeclaredDependency>-->
<!-- javax.activation:activation-->
<!-- </ignoredUnusedDeclaredDependency>-->
<!-- <ignoredUnusedDeclaredDependency>-->
<!-- javax.xml.bind:jaxb-api-->
<!-- </ignoredUnusedDeclaredDependency>-->
<!-- <ignoredUnusedDeclaredDependency>-->
<!-- org.glassfish.jaxb:jax-runtime-->
<!-- </ignoredUnusedDeclaredDependency>-->
<!-- <ignoredUnusedDeclaredDependency>-->
<!-- org.apache.hbase:hbase-it-->
<!-- </ignoredUnusedDeclaredDependency>-->
<!-- <ignoredUnusedDeclaredDependency>-->
<!-- org.apache.phoenix:phoenix-hbase-compat-${hbase.compat.version}-->
<!-- </ignoredUnusedDeclaredDependency>-->
<!-- <ignoredUnusedDeclaredDependency>-->
<!-- org.apache.hbase:hbase-testing-util-->
<!-- </ignoredUnusedDeclaredDependency>-->
<!-- <ignoredUnusedDeclaredDependency>-->
<!-- org.apache.logging.log4j:log4j-api-->
<!-- </ignoredUnusedDeclaredDependency>-->
<!-- <ignoredUnusedDeclaredDependency>-->
<!-- org.apache.logging.log4j:log4j-core-->
<!-- </ignoredUnusedDeclaredDependency>-->
<!-- <ignoredUnusedDeclaredDependency>-->
<!-- org.apache.logging.log4j:log4j-slf4j-impl-->
<!-- </ignoredUnusedDeclaredDependency>-->
<!-- <ignoredUnusedDeclaredDependency>-->
<!-- org.apache.logging.log4j:log4j-1.2-api-->
<!-- </ignoredUnusedDeclaredDependency>-->
<!-- </ignoredUnusedDeclaredDependencies>-->
<!-- <ignoredUsedUndeclaredDependencies>-->
<!-- <ignoredUsedUndeclaredDependency>-->
<!-- jakarta.xml.bind:jakarta.xml.bind-api-->
<!-- </ignoredUsedUndeclaredDependency>-->
<!-- </ignoredUsedUndeclaredDependencies>-->
<!-- </configuration>-->
<!-- </plugin>-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<workingDirectory>${java.io.tmpdir}</workingDirectory>
<forkCount>1</forkCount>
<forkNode implementation="org.apache.maven.plugin.surefire.extensions.SurefireForkNodeFactory"/>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Loading

0 comments on commit 12b9664

Please sign in to comment.