diff --git a/flexmark/pom.xml b/flexmark/pom.xml index 16cf3116c..b39f5ceb2 100644 --- a/flexmark/pom.xml +++ b/flexmark/pom.xml @@ -62,6 +62,10 @@ com.vladsch.flexmark flexmark-util-visitor + + io.opentelemetry.instrumentation + opentelemetry-instrumentation-annotations + org.openjdk.jmh jmh-core diff --git a/flexmark/src/main/java/com/vladsch/flexmark/html/HtmlRenderer.java b/flexmark/src/main/java/com/vladsch/flexmark/html/HtmlRenderer.java index 91a9db8c5..7a41e81cf 100644 --- a/flexmark/src/main/java/com/vladsch/flexmark/html/HtmlRenderer.java +++ b/flexmark/src/main/java/com/vladsch/flexmark/html/HtmlRenderer.java @@ -18,6 +18,7 @@ import com.vladsch.flexmark.util.sequence.Escaping; import com.vladsch.flexmark.util.sequence.LineAppendable; import com.vladsch.flexmark.util.sequence.TagRange; +import io.opentelemetry.instrumentation.annotations.WithSpan; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -203,6 +204,7 @@ public void render(@NotNull Node node, @NotNull Appendable output) { * @param node node to render * @param output appendable to use for the output */ + @WithSpan("markdown.render") public void render(@NotNull Node node, @NotNull Appendable output, int maxTrailingBlankLines) { HtmlWriter htmlWriter = new HtmlWriter(output, htmlOptions.indentSize, htmlOptions.formatFlags, !htmlOptions.htmlBlockOpenTagEol, !htmlOptions.htmlBlockCloseTagEol); MainNodeRenderer renderer = new MainNodeRenderer(options, htmlWriter, node.getDocument()); diff --git a/flexmark/src/main/java/com/vladsch/flexmark/parser/Parser.java b/flexmark/src/main/java/com/vladsch/flexmark/parser/Parser.java index 22a93ce4d..17ccc6ea5 100644 --- a/flexmark/src/main/java/com/vladsch/flexmark/parser/Parser.java +++ b/flexmark/src/main/java/com/vladsch/flexmark/parser/Parser.java @@ -17,6 +17,7 @@ import com.vladsch.flexmark.util.sequence.BasedSequence; import com.vladsch.flexmark.util.sequence.ReplacedBasedSequence; import com.vladsch.flexmark.util.sequence.mappers.SpecialLeadInHandler; +import io.opentelemetry.instrumentation.annotations.WithSpan; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -353,6 +354,7 @@ public static Builder builder(DataHolder options) { * @param input the text to parse * @return the root node */ + @WithSpan("markdown.parse") public @NotNull Document parse(@NotNull BasedSequence input) { // NOTE: parser can only handle contiguous sequences with no out of base characters if (input instanceof ReplacedBasedSequence) { @@ -379,6 +381,7 @@ public static Builder builder(DataHolder options) { * @param input the text to parse * @return the root node */ + @WithSpan("markdown.parse") public @NotNull Document parse(@NotNull String input) { DocumentParser documentParser = new DocumentParser(options , blockParserFactories @@ -398,6 +401,7 @@ public static Builder builder(DataHolder options) { * @return the root node * @throws IOException when reading throws an exception */ + @WithSpan("markdown.parse") public @NotNull Document parseReader(@NotNull Reader input) throws IOException { DocumentParser documentParser = new DocumentParser(options , blockParserFactories diff --git a/flexmark/src/main/java/com/vladsch/flexmark/parser/internal/DocumentParser.java b/flexmark/src/main/java/com/vladsch/flexmark/parser/internal/DocumentParser.java index c4a539ecf..6cd3c85d0 100644 --- a/flexmark/src/main/java/com/vladsch/flexmark/parser/internal/DocumentParser.java +++ b/flexmark/src/main/java/com/vladsch/flexmark/parser/internal/DocumentParser.java @@ -18,6 +18,7 @@ import com.vladsch.flexmark.util.misc.CharPredicate; import com.vladsch.flexmark.util.sequence.BasedSequence; import com.vladsch.flexmark.util.sequence.PrefixedSubSequence; +import io.opentelemetry.instrumentation.annotations.WithSpan; import org.jetbrains.annotations.NotNull; import java.io.BufferedReader; @@ -271,16 +272,23 @@ public InlineParser getInlineParser() { */ public Document parse(CharSequence source) { BasedSequence input = BasedSequence.of(source); - int lineStart = 0; - int lineBreak; - int lineEOL; - int lineEnd; lineNumber = 0; documentBlockParser.initializeDocument(options, input); inlineParser.initializeDocument(documentBlockParser.getBlock()); currentPhase = ParserPhase.PARSE_BLOCKS; + parseBlocks(input); + + return finalizeAndProcess(); + } + + @WithSpan("markdown.parse.blocks") + private void parseBlocks(BasedSequence input) { + int lineStart = 0; + int lineBreak; + int lineEOL; + int lineEnd; while ((lineBreak = Parsing.findLineBreak(input, lineStart)) != -1) { BasedSequence line = input.subSequence(lineStart, lineBreak); @@ -308,8 +316,6 @@ public Document parse(CharSequence source) { incorporateLine(lineWithEOL); lineNumber++; } - - return finalizeAndProcess(); } public Document parse(Reader input) throws IOException { @@ -745,6 +751,7 @@ private void finalize(BlockParser blockParser) { /** * Walk through a block & children recursively, parsing string content into inline content where appropriate. */ + @WithSpan("markdown.parse.inlines") private void processInlines() { for (BlockParser blockParser : blockTracker.allBlockParsers()) { blockParser.parseInlines(inlineParser); @@ -938,6 +945,7 @@ private void preProcessParagraph(Paragraph block, List> blockTypes = new HashSet<>(); diff --git a/flexmark/src/main/java/com/vladsch/flexmark/parser/internal/PostProcessorManager.java b/flexmark/src/main/java/com/vladsch/flexmark/parser/internal/PostProcessorManager.java index 3d3749ef6..8021db187 100644 --- a/flexmark/src/main/java/com/vladsch/flexmark/parser/internal/PostProcessorManager.java +++ b/flexmark/src/main/java/com/vladsch/flexmark/parser/internal/PostProcessorManager.java @@ -12,6 +12,7 @@ import com.vladsch.flexmark.util.dependency.DependencyResolver; import com.vladsch.flexmark.util.dependency.DependentItem; import com.vladsch.flexmark.util.dependency.DependentItemMap; +import io.opentelemetry.instrumentation.annotations.WithSpan; import java.util.*; @@ -50,6 +51,7 @@ public static List calculatePostProcessors(DataHol return dependencyStages; } + @WithSpan("markdown.parse.post_process") public static Document processDocument(Document document, List processorDependencies) { if (!processorDependencies.isEmpty()) { PostProcessorManager manager = new PostProcessorManager(processorDependencies); diff --git a/pom.xml b/pom.xml index 679b15aa6..659fd74ed 100644 --- a/pom.xml +++ b/pom.xml @@ -538,6 +538,15 @@ ${project.version} + + + io.opentelemetry.instrumentation + opentelemetry-instrumentation-annotations + 2.16.0 + + junit