From 9b4d7f09c12d44a633687f8c650d91f507714332 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Fri, 8 Sep 2023 16:32:25 +0200 Subject: [PATCH] Spring Cloud Task generates documentation for Antora infra Migrate Structure Insert explicit ids for headers Remove unnecessary asciidoc attributes Copy default antora files Fix indentation for all pages Generate a default navigation Remove includes Fix cross references Enable Section Summary TOC for small pages WIP Nav.adoc now represents a list of navigation properties Warning and errors are now resolved. Observability docs now present in navigation bar and properly visible Index.adoc contains preface information . Nav.adoc contains proper ordering for appendix information --- .github/workflows/deploy-docs.yml | 32 +++++++ .gitignore | 6 ++ README.adoc | 6 ++ docs/antora-playbook.yml | 38 ++++++++ docs/antora.yml | 12 +++ .../ROOT/assets/images/task_schema.png | Bin 0 -> 52049 bytes docs/modules/ROOT/nav.adoc | 11 +++ .../ROOT/pages}/_attributes.adoc | 2 - .../appendix-building-the-documentation.adoc | 3 +- .../appendix-task-repository-schema.adoc | 14 +-- docs/modules/ROOT/pages/appendix.adoc | 10 +++ .../ROOT/pages}/batch-starter.adoc | 5 +- .../ROOT/pages}/batch.adoc | 6 +- docs/modules/ROOT/pages/configprops.adoc | 6 ++ .../ROOT/pages}/features.adoc | 5 +- .../ROOT/pages}/getting-started.adoc | 3 +- docs/modules/ROOT/pages/index.adoc | 25 ++++++ docs/modules/ROOT/pages/observability.adoc | 8 ++ .../ROOT/pages}/preface.adoc | 17 ++-- .../ROOT/pages}/spring-cloud-task.adoc | 10 +-- .../ROOT/pages}/stream.adoc | 3 + .../ROOT/partials}/_configprops.adoc | 0 docs/modules/ROOT/partials/_conventions.adoc | 13 +++ docs/modules/ROOT/partials/_metrics.adoc | 82 ++++++++++++++++++ docs/modules/ROOT/partials/_spans.adoc | 56 ++++++++++++ docs/pom.xml | 48 ++++++---- .../resources/antora-resources/antora.yml | 20 +++++ docs/src/main/asciidoc/README.adoc | 6 ++ docs/src/main/asciidoc/_observability.adoc | 8 -- docs/src/main/asciidoc/appendix.adoc | 12 --- docs/src/main/asciidoc/index.adoc | 1 - 31 files changed, 396 insertions(+), 72 deletions(-) create mode 100644 .github/workflows/deploy-docs.yml create mode 100644 docs/antora-playbook.yml create mode 100644 docs/antora.yml create mode 100644 docs/modules/ROOT/assets/images/task_schema.png create mode 100644 docs/modules/ROOT/nav.adoc rename docs/{src/main/asciidoc => modules/ROOT/pages}/_attributes.adoc (99%) rename docs/{src/main/asciidoc => modules/ROOT/pages}/appendix-building-the-documentation.adoc (76%) rename docs/{src/main/asciidoc => modules/ROOT/pages}/appendix-task-repository-schema.adoc (91%) create mode 100644 docs/modules/ROOT/pages/appendix.adoc rename docs/{src/main/asciidoc => modules/ROOT/pages}/batch-starter.adoc (99%) rename docs/{src/main/asciidoc => modules/ROOT/pages}/batch.adoc (96%) create mode 100644 docs/modules/ROOT/pages/configprops.adoc rename docs/{src/main/asciidoc => modules/ROOT/pages}/features.adoc (98%) rename docs/{src/main/asciidoc => modules/ROOT/pages}/getting-started.adoc (98%) create mode 100644 docs/modules/ROOT/pages/index.adoc create mode 100644 docs/modules/ROOT/pages/observability.adoc rename docs/{src/main/asciidoc => modules/ROOT/pages}/preface.adoc (65%) rename docs/{src/main/asciidoc => modules/ROOT/pages}/spring-cloud-task.adoc (74%) rename docs/{src/main/asciidoc => modules/ROOT/pages}/stream.adoc (98%) rename docs/{src/main/asciidoc => modules/ROOT/partials}/_configprops.adoc (100%) create mode 100644 docs/modules/ROOT/partials/_conventions.adoc create mode 100644 docs/modules/ROOT/partials/_metrics.adoc create mode 100644 docs/modules/ROOT/partials/_spans.adoc create mode 100644 docs/src/main/antora/resources/antora-resources/antora.yml delete mode 100644 docs/src/main/asciidoc/_observability.adoc delete mode 100644 docs/src/main/asciidoc/appendix.adoc delete mode 100644 docs/src/main/asciidoc/index.adoc diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml new file mode 100644 index 00000000..be4b92df --- /dev/null +++ b/.github/workflows/deploy-docs.yml @@ -0,0 +1,32 @@ +name: Deploy Docs +on: + push: + branches-ignore: [ gh-pages ] + tags: '**' + repository_dispatch: + types: request-build-reference # legacy + #schedule: + #- cron: '0 10 * * *' # Once per day at 10am UTC + workflow_dispatch: +permissions: + actions: write +jobs: + build: + runs-on: ubuntu-latest + # if: github.repository_owner == 'spring-cloud' + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + ref: docs-build + fetch-depth: 1 + - name: Dispatch (partial build) + if: github.ref_type == 'branch' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: gh workflow run deploy-docs.yml -r $(git rev-parse --abbrev-ref HEAD) -f build-refname=${{ github.ref_name }} + - name: Dispatch (full build) + if: github.ref_type == 'tag' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: gh workflow run deploy-docs.yml -r $(git rev-parse --abbrev-ref HEAD) diff --git a/.gitignore b/.gitignore index de421b99..f5a6f0e6 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,9 @@ spring-*/src/main/java/META-INF/MANIFEST.MF # Github Actions .m2 + +node +node_modules +build +package.json +package-lock.json diff --git a/README.adoc b/README.adoc index 6f38d6d9..20e2e963 100644 --- a/README.adoc +++ b/README.adoc @@ -5,6 +5,7 @@ Edit the files in the src/main/asciidoc/ directory instead. //// +[[spring-cloud-task]] = Spring Cloud Task Is a project centered around the idea of processing on demand. A user is able to develop @@ -12,10 +13,12 @@ a “task” that can be deployed, executed and removed on demand, yet the resul process persists beyond the life of the task for future reporting. +[[requirements:]] == Requirements: * Java 17 or Above +[[build-main-project:]] == Build Main Project: [source,shell,indent=2] @@ -23,6 +26,7 @@ process persists beyond the life of the task for future reporting. $ ./mvnw clean install ---- +[[example:]] == Example: [source,java,indent=2] @@ -50,9 +54,11 @@ public class MyApp { } ---- +[[code-of-conduct]] == Code of Conduct This project adheres to the Contributor Covenant link:CODE_OF_CONDUCT.adoc[code of conduct]. By participating, you are expected to uphold this code. Please report unacceptable behavior to spring-code-of-conduct@pivotal.io. +[[building-the-project]] == Building the Project This project requires that you invoke the Javadoc engine from the Maven command line. You can do so by appending `javadoc:aggregate` to the rest of your Maven command. diff --git a/docs/antora-playbook.yml b/docs/antora-playbook.yml new file mode 100644 index 00000000..e7720312 --- /dev/null +++ b/docs/antora-playbook.yml @@ -0,0 +1,38 @@ +antora: + extensions: + - '@springio/antora-extensions/partial-build-extension' + - require: '@springio/antora-extensions/latest-version-extension' + - require: '@springio/antora-extensions/inject-collector-cache-config-extension' + - '@antora/collector-extension' + - '@antora/atlas-extension' + - require: '@springio/antora-extensions/root-component-extension' + root_component_name: 'cloud-task' +site: + title: Spring Cloud Task + url: https://docs.spring.io/spring-cloud-task/reference/ +content: + sources: + - url: ./.. + branches: HEAD + start_path: docs + worktrees: true +asciidoc: + attributes: + page-stackoverflow-url: https://stackoverflow.com/tags/spring-cloud + page-pagination: '' + hide-uri-scheme: '@' + tabs-sync-option: '@' + chomp: 'all' + extensions: + - '@asciidoctor/tabs' + - '@springio/asciidoctor-extensions' + sourcemap: true +urls: + latest_version_segment: '' +runtime: + log: + failure_level: warn + format: pretty +ui: + bundle: + url: https://github.com/spring-io/antora-ui-spring/releases/download/v0.3.5/ui-bundle.zip diff --git a/docs/antora.yml b/docs/antora.yml new file mode 100644 index 00000000..a1c0b6b6 --- /dev/null +++ b/docs/antora.yml @@ -0,0 +1,12 @@ +name: cloud-task +version: true +title: spring-cloud-task +nav: + - modules/ROOT/nav.adoc +ext: + collector: + run: + command: ./mvnw --no-transfer-progress -B process-resources -Pdocs -pl docs -Dantora-maven-plugin.phase=none -Dgenerate-docs.phase=none -Dgenerate-readme.phase=none -Dgenerate-cloud-resources.phase=none -Dmaven-dependency-plugin-for-docs.phase=none -Dmaven-dependency-plugin-for-docs-classes.phase=none -DskipTests + local: true + scan: + dir: ./target/classes/antora-resources/ diff --git a/docs/modules/ROOT/assets/images/task_schema.png b/docs/modules/ROOT/assets/images/task_schema.png new file mode 100644 index 0000000000000000000000000000000000000000..aa98a9d60d7a4d99996a025d13faaedcc903c2d5 GIT binary patch literal 52049 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 JPtN@2{{S8$&w2m= literal 0 HcmV?d00001 diff --git a/docs/modules/ROOT/nav.adoc b/docs/modules/ROOT/nav.adoc new file mode 100644 index 00000000..4afa587e --- /dev/null +++ b/docs/modules/ROOT/nav.adoc @@ -0,0 +1,11 @@ +* xref:index.adoc[] +* xref:preface.adoc[] +* xref:getting-started.adoc[] +* xref:features.adoc[] +* xref:batch.adoc[] +* xref:batch-starter.adoc[] +* xref:stream.adoc[] +* xref:appendix.adoc[] +** xref:appendix-task-repository-schema.adoc[] +** xref:appendix-building-the-documentation.adoc[] +** xref:observability.adoc[] diff --git a/docs/src/main/asciidoc/_attributes.adoc b/docs/modules/ROOT/pages/_attributes.adoc similarity index 99% rename from docs/src/main/asciidoc/_attributes.adoc rename to docs/modules/ROOT/pages/_attributes.adoc index 9d81da7f..918a0223 100644 --- a/docs/src/main/asciidoc/_attributes.adoc +++ b/docs/modules/ROOT/pages/_attributes.adoc @@ -1,8 +1,6 @@ :doctype: book :idprefix: :idseparator: - -:toc: left -:toclevels: 4 :tabsize: 4 :numbered: :sectanchors: diff --git a/docs/src/main/asciidoc/appendix-building-the-documentation.adoc b/docs/modules/ROOT/pages/appendix-building-the-documentation.adoc similarity index 76% rename from docs/src/main/asciidoc/appendix-building-the-documentation.adoc rename to docs/modules/ROOT/pages/appendix-building-the-documentation.adoc index 1103edaf..e015445d 100644 --- a/docs/src/main/asciidoc/appendix-building-the-documentation.adoc +++ b/docs/modules/ROOT/pages/appendix-building-the-documentation.adoc @@ -1,6 +1,7 @@ [[appendix-building-the-documentation]] -== Building This Documentation += Building This Documentation +:page-section-summary-toc: 1 This project uses Maven to generate this documentation. To generate it for yourself, run the following command: `$ mvn clean install -DskipTests -P docs`. diff --git a/docs/src/main/asciidoc/appendix-task-repository-schema.adoc b/docs/modules/ROOT/pages/appendix-task-repository-schema.adoc similarity index 91% rename from docs/src/main/asciidoc/appendix-task-repository-schema.adoc rename to docs/modules/ROOT/pages/appendix-task-repository-schema.adoc index ce8096b3..f5882b43 100644 --- a/docs/src/main/asciidoc/appendix-task-repository-schema.adoc +++ b/docs/modules/ROOT/pages/appendix-task-repository-schema.adoc @@ -1,5 +1,5 @@ [[appendix-task-repository-schema]] -== Task Repository Schema += Task Repository Schema [[partintro]] -- @@ -8,7 +8,8 @@ This appendix provides an ERD for the database schema used in the task repositor image::task_schema.png[] -=== Table Information +[[table-information]] +== Table Information -- .TASK_EXECUTION @@ -34,9 +35,9 @@ Spring Cloud Task Framework at app startup establishes the next available id as |LAST_UPDATED |TRUE | TIMESTAMP | X | Spring Cloud Task Framework at app startup establishes the value. Or if the record is created outside of task then the value must be populated at record creation time. -|EXTERNAL_EXECUTION_ID |FALSE | VARCHAR | 250 | If the `spring.cloud.task.external-execution-id` property is set then Spring Cloud Task Framework at app startup will set this to the value specified. More information can be found <> +|EXTERNAL_EXECUTION_ID |FALSE | VARCHAR | 250 | If the `spring.cloud.task.external-execution-id` property is set then Spring Cloud Task Framework at app startup will set this to the value specified. More information can be found xref:features.adoc#features-external_task_id[here] -|PARENT_TASK_EXECUTION_ID |FALSE |BIGINT | X | If the `spring.cloud.task.parent-execution-id` property is set then Spring Cloud Task Framework at app startup will set this to the value specified. More information can be found <> +|PARENT_TASK_EXECUTION_ID |FALSE |BIGINT | X | If the `spring.cloud.task.parent-execution-id` property is set then Spring Cloud Task Framework at app startup will set this to the value specified. More information can be found xref:features.adoc#features-parent_task_id[here] |========================================================= @@ -65,7 +66,7 @@ Used to link the task execution to the batch execution. .TASK_LOCK -Used for the `single-instance-enabled` feature discussed <>. +Used for the `single-instance-enabled` feature discussed xref:features.adoc#features-single-instance-enabled[here]. [width="80%", cols="1,1,1,1,10", options="header"] |========================================================= |Column Name |Required |Type | Field Length |Notes @@ -84,7 +85,8 @@ Used for the `single-instance-enabled` feature discussed < @@ -22,16 +21,13 @@ To obtain the starter for Maven, add the following to your build: 2.3.0 ---- -==== To obtain the starter for Gradle, add the following to your build: -==== [source,groovy] ---- compile "org.springframework.cloud:spring-cloud-starter-single-step-batch-job:2.3.0" ---- -==== [[job-definition]] == Defining a Job @@ -625,6 +621,7 @@ Second, this starter lets you configure two properties on the writer. For more about the configuration options for the `KafkaItemWriter`, see the https://docs.spring.io/spring-batch/docs/4.3.x/api/org/springframework/batch/item/kafka/KafkaItemWriter.html[`KafkaItemWiter` documentation]. +[[spring-aot]] === Spring AOT When using Spring AOT with Single Step Batch Starter you must set the reader and writer name properties at compile time (unless you create a bean(s) for the reader and or writer). diff --git a/docs/src/main/asciidoc/batch.adoc b/docs/modules/ROOT/pages/batch.adoc similarity index 96% rename from docs/src/main/asciidoc/batch.adoc rename to docs/modules/ROOT/pages/batch.adoc index 958854b1..0347d753 100644 --- a/docs/src/main/asciidoc/batch.adoc +++ b/docs/modules/ROOT/pages/batch.adoc @@ -135,6 +135,7 @@ NOTE: You can find a sample remote partition application in the samples module o Spring Cloud Task project, https://github.com/spring-cloud/spring-cloud-task/tree/master/spring-cloud-task-samples/partitioned-batch-job[here]. +[[asynchronously-launch-remote-batch-partitions]] === Asynchronously launch remote batch partitions By default batch partitions are launched sequentially. However, in some cases this may affect performance as each launch will block until the resource (For example: provisioning a pod in Kubernetes) is provisioned. @@ -169,6 +170,7 @@ For example: NOTE: We need to close the context since the use of `ThreadPoolTaskExecutor` leaves a thread active thus the app will not terminate. To close the application appropriately, we will need to set `spring.cloud.task.closecontextEnabled` property to `true`. +[[notes-on-developing-a-batch-partitioned-application-for-the-kubernetes-platform]] === Notes on Developing a Batch-partitioned application for the Kubernetes Platform * When deploying partitioned apps on the Kubernetes platform, you must use the following @@ -190,12 +192,12 @@ Otherwise, an exception is thrown. == Batch Informational Messages Spring Cloud Task provides the ability for batch jobs to emit informational messages. The -"`<>`" section covers this feature in detail. +"`xref:stream.adoc#stream-integration-batch-events[Spring Batch Events]`" section covers this feature in detail. [[batch-failures-and-tasks]] == Batch Job Exit Codes -As discussed <>, Spring Cloud Task +As discussed xref:features.adoc#features-lifecycle-exit-codes[earlier], Spring Cloud Task applications support the ability to record the exit code of a task execution. However, in cases where you run a Spring Batch Job within a task, regardless of how the Batch Job Execution completes, the result of the task is always zero when using the default diff --git a/docs/modules/ROOT/pages/configprops.adoc b/docs/modules/ROOT/pages/configprops.adoc new file mode 100644 index 00000000..32cbb8e5 --- /dev/null +++ b/docs/modules/ROOT/pages/configprops.adoc @@ -0,0 +1,6 @@ +[[configuration-properties]] += Configuration Properties + +Below you can find a list of configuration properties. + +include::partial$_configprops.adoc[] diff --git a/docs/src/main/asciidoc/features.adoc b/docs/modules/ROOT/pages/features.adoc similarity index 98% rename from docs/src/main/asciidoc/features.adoc rename to docs/modules/ROOT/pages/features.adoc index 5922b5bb..1fc9af7c 100644 --- a/docs/src/main/asciidoc/features.adoc +++ b/docs/modules/ROOT/pages/features.adoc @@ -98,7 +98,7 @@ boot application. === Mapping Exit Codes When a task completes, it tries to return an exit code to the OS. If we take a look -at our <>, we can see that we are +at our xref:getting-started.adoc#getting-started-developing-first-task[original example], we can see that we are not controlling that aspect of our application. So, if an exception is thrown, the JVM returns a code that may or may not be of any use to you in debugging. @@ -372,6 +372,7 @@ application: NOTE: The exit code for the application will be 1 if the task fails because this feature is enabled and another task is running with the same task name. +[[single-instance-usage-for-spring-aot-and-native-compilation]] ==== Single Instance Usage for Spring AOT And Native Compilation To use Spring Cloud Task's single-instance feature when creating a natively compiled app, you need to enable the feature at build time. To do so, add the process-aot execution and set `spring.cloud.task.single-step-instance-enabled=true` as a JVM argument, as follows: @@ -394,6 +395,7 @@ To do so, add the process-aot execution and set `spring.cloud.task.single-step-i +[[enabling-observations-for-applicationrunner-and-commandlinerunner]] === Enabling Observations for ApplicationRunner and CommandLineRunner @@ -401,6 +403,7 @@ To Enable Task Observations for `ApplicationRunner` or `CommandLineRunner` set ` An example task application with observations enables using the `SimpleMeterRegistry` can be found https://github.com/spring-cloud/spring-cloud-task/tree/main/spring-cloud-task-samples/task-observations[here]. +[[disabling-spring-cloud-task-auto-configuration]] === Disabling Spring Cloud Task Auto Configuration In cases where Spring Cloud Task should not be autoconfigured for an implementation, you can disable Task's auto configuration. diff --git a/docs/src/main/asciidoc/getting-started.adoc b/docs/modules/ROOT/pages/getting-started.adoc similarity index 98% rename from docs/src/main/asciidoc/getting-started.adoc rename to docs/modules/ROOT/pages/getting-started.adoc index f59cde28..5142bb34 100755 --- a/docs/src/main/asciidoc/getting-started.adoc +++ b/docs/modules/ROOT/pages/getting-started.adoc @@ -23,6 +23,7 @@ environment. You need to have Java installed (Java 17 or better). To build, you need to have Maven installed as well. +[[database-requirements]] === Database Requirements Spring Cloud Task uses a relational database to store the results of an executed task. @@ -136,7 +137,7 @@ In our demo, the `TaskRepository` uses an embedded H2 database to record the res of a task. This H2 embedded database is not a practical solution for a production environment, since the H2 DB goes away once the task ends. However, for a quick getting-started experience, we can use this in our example as well as echoing to the logs what is being updated -in that repository. In the <> section (later in this +in that repository. In the xref:features.adoc#features-configuration[Configuration] section (later in this documentation), we cover how to customize the configuration of the pieces provided by Spring Cloud Task. diff --git a/docs/modules/ROOT/pages/index.adoc b/docs/modules/ROOT/pages/index.adoc new file mode 100644 index 00000000..22e6a15f --- /dev/null +++ b/docs/modules/ROOT/pages/index.adoc @@ -0,0 +1,25 @@ +[[spring-cloud-task-reference-guide]] += Spring Cloud Task Reference Guide +:page-section-summary-toc: 1 +Michael Minella, Glenn Renfro, Jay Bryant + + +// ====================================================================================== + +Version {project-version} + +(C) 2009-2022 VMware, Inc. All rights reserved. + +Copies of this document may be made for your own use and for distribution to +others, provided that you do not charge any fee for such copies and further +provided that each copy contains this Copyright Notice, whether distributed in +print or electronically. + + + + + + + + +// ====================================================================================== diff --git a/docs/modules/ROOT/pages/observability.adoc b/docs/modules/ROOT/pages/observability.adoc new file mode 100644 index 00000000..9784e942 --- /dev/null +++ b/docs/modules/ROOT/pages/observability.adoc @@ -0,0 +1,8 @@ +[[observability]] += Observability + +== Observability metadata + +include::partial$_metrics.adoc[] + +include::partial$_spans.adoc[] diff --git a/docs/src/main/asciidoc/preface.adoc b/docs/modules/ROOT/pages/preface.adoc similarity index 65% rename from docs/src/main/asciidoc/preface.adoc rename to docs/modules/ROOT/pages/preface.adoc index 0c47f351..7093d75e 100644 --- a/docs/src/main/asciidoc/preface.adoc +++ b/docs/modules/ROOT/pages/preface.adoc @@ -7,10 +7,11 @@ This section provides a brief overview of the Spring Cloud Task reference docume Think of it as a map for the rest of the document. You can read this reference guide in a linear fashion or you can skip sections if something does not interest you. +[[about-the-documentation]] == About the documentation -The Spring Cloud Task reference guide is available in {spring-cloud-task-docs}[html] -and {spring-cloud-task-docs}/index.pdf[pdf]. The latest copy is available at -{spring-cloud-task-docs-current}. +The Spring Cloud Task reference guide is available in https://docs.spring.io/spring-cloud-task/docs/current/reference[html]. +The latest copy is available at +https://docs.spring.io/spring-cloud-task/docs/current-SNAPSHOT/reference/html/. Copies of this document may be made for your own use and for distribution to others, provided that you do not charge any fee for such copies and further provided that each @@ -32,14 +33,14 @@ involved]. [[task-documentation-first-steps]] == First Steps If you are just getting started with Spring Cloud Task or with 'Spring' in general, we -suggesting reading the <> chapter. +suggesting reading the xref:getting-started.adoc[Getting started] chapter. To get started from scratch, read the following sections: -* <> -* <> + +* xref:getting-started.adoc#getting-started-introducing-spring-cloud-task[Introducing Spring Cloud Task] +* xref:getting-started.adoc#getting-started-system-requirements[System Requirements] + To follow the tutorial, read -<> + +xref:getting-started.adoc#getting-started-developing-first-task[Developing Your First Spring Cloud Task Application] + To run your example, read -<> +xref:getting-started.adoc#getting-started-running-the-example[Running the Example] diff --git a/docs/src/main/asciidoc/spring-cloud-task.adoc b/docs/modules/ROOT/pages/spring-cloud-task.adoc similarity index 74% rename from docs/src/main/asciidoc/spring-cloud-task.adoc rename to docs/modules/ROOT/pages/spring-cloud-task.adoc index 99c6585c..22e6a15f 100644 --- a/docs/src/main/asciidoc/spring-cloud-task.adoc +++ b/docs/modules/ROOT/pages/spring-cloud-task.adoc @@ -1,7 +1,8 @@ +[[spring-cloud-task-reference-guide]] = Spring Cloud Task Reference Guide +:page-section-summary-toc: 1 Michael Minella, Glenn Renfro, Jay Bryant -include::_attributes.adoc[] // ====================================================================================== @@ -14,18 +15,11 @@ others, provided that you do not charge any fee for such copies and further provided that each copy contains this Copyright Notice, whether distributed in print or electronically. -include::preface.adoc[] -include::getting-started.adoc[] -include::features.adoc[] -include::batch.adoc[] -include::batch-starter.adoc[] -include::stream.adoc[] -include::appendix.adoc[] // ====================================================================================== diff --git a/docs/src/main/asciidoc/stream.adoc b/docs/modules/ROOT/pages/stream.adoc similarity index 98% rename from docs/src/main/asciidoc/stream.adoc rename to docs/modules/ROOT/pages/stream.adoc index 28da2750..558af79f 100644 --- a/docs/src/main/asciidoc/stream.adoc +++ b/docs/modules/ROOT/pages/stream.adoc @@ -162,6 +162,7 @@ NOTE: A sample batch event application can be found in the samples module of the Spring Cloud Task Project, https://github.com/spring-cloud/spring-cloud-task/tree/master/spring-cloud-task-samples/batch-events[here]. +[[sending-batch-events-to-different-channels]] === Sending Batch Events to Different Channels One of the options that Spring Cloud Task offers for batch events is the ability to alter @@ -174,6 +175,7 @@ following configuration: `spring.cloud.task.batch.events.step-execution-events-binding-name=my-step-execution-events` +[[disabling-batch-events]] === Disabling Batch Events To disable the listener functionality for all batch events, use the following configuration: @@ -197,6 +199,7 @@ spring.cloud.task.batch.events.item-write.enabled=false spring.cloud.task.batch.events.skip.enabled=false ---- +[[emit-order-for-batch-events]] === Emit Order for Batch Events By default, batch events have `Ordered.LOWEST_PRECEDENCE`. To change this value (for example, to 5 ), use the following configuration: diff --git a/docs/src/main/asciidoc/_configprops.adoc b/docs/modules/ROOT/partials/_configprops.adoc similarity index 100% rename from docs/src/main/asciidoc/_configprops.adoc rename to docs/modules/ROOT/partials/_configprops.adoc diff --git a/docs/modules/ROOT/partials/_conventions.adoc b/docs/modules/ROOT/partials/_conventions.adoc new file mode 100644 index 00000000..36625960 --- /dev/null +++ b/docs/modules/ROOT/partials/_conventions.adoc @@ -0,0 +1,13 @@ +[[observability-conventions]] +=== Observability - Conventions + +Below you can find a list of all `GlobalObservationConvention` and `ObservationConvention` declared by this project. + +.ObservationConvention implementations +|=== +|ObservationConvention Class Name | Applicable ObservationContext Class Name +|`org.springframework.cloud.task.listener.DefaultTaskExecutionObservationConvention`|`TaskExecutionObservationContext` +|`org.springframework.cloud.task.listener.TaskExecutionObservationConvention`|`TaskExecutionObservationContext` +|`org.springframework.cloud.task.configuration.observation.DefaultTaskObservationConvention`|`TaskObservationContext` +|`org.springframework.cloud.task.configuration.observation.TaskObservationConvention`|`TaskObservationContext` +|=== diff --git a/docs/modules/ROOT/partials/_metrics.adoc b/docs/modules/ROOT/partials/_metrics.adoc new file mode 100644 index 00000000..e25dbc61 --- /dev/null +++ b/docs/modules/ROOT/partials/_metrics.adoc @@ -0,0 +1,82 @@ +[[observability-metrics]] +=== Observability - Metrics + +Below you can find a list of all metrics declared by this project. + +[[observability-metrics-task-active]] +==== Task Active + +____ +Metrics created around a task execution. +____ + + +**Metric name** `spring.cloud.task` (defined by convention class `org.springframework.cloud.task.listener.DefaultTaskExecutionObservationConvention`). **Type** `timer`. + +**Metric name** `spring.cloud.task.active` (defined by convention class `org.springframework.cloud.task.listener.DefaultTaskExecutionObservationConvention`). **Type** `long task timer`. + + +IMPORTANT: KeyValues that are added after starting the Observation might be missing from the *.active metrics. + + +IMPORTANT: Micrometer internally uses `nanoseconds` for the baseunit. However, each backend determines the actual baseunit. (i.e. Prometheus uses seconds) + + +Fully qualified name of the enclosing class `org.springframework.cloud.task.listener.TaskExecutionObservation`. + +IMPORTANT: All tags must be prefixed with `spring.cloud.task` prefix! + +.Low cardinality Keys +[cols="a,a"] +|=== +|Name | Description +|`spring.cloud.task.cf.app.id` _(required)_|App id for CF cloud. +|`spring.cloud.task.cf.app.name` _(required)_|App name for CF cloud. +|`spring.cloud.task.cf.app.version` _(required)_|App version for CF cloud. +|`spring.cloud.task.cf.instance.index` _(required)_|Instance index for CF cloud. +|`spring.cloud.task.cf.org.name` _(required)_|Organization Name for CF cloud. +|`spring.cloud.task.cf.space.id` _(required)_|Space id for CF cloud. +|`spring.cloud.task.cf.space.name` _(required)_|Space name for CF cloud. +|`spring.cloud.task.execution.id` _(required)_|Task execution id. +|`spring.cloud.task.exit.code` _(required)_|Task exit code. +|`spring.cloud.task.external.execution.id` _(required)_|External execution id for task. +|`spring.cloud.task.name` _(required)_|Task name measurement. +|`spring.cloud.task.parent.execution.id` _(required)_|Task parent execution id. +|`spring.cloud.task.status` _(required)_|task status. Can be either success or failure. +|=== + + + +[[observability-metrics-task-runner-observation]] +==== Task Runner Observation + +____ +Observation created when a task runner is executed. +____ + + +**Metric name** `spring.cloud.task.runner` (defined by convention class `org.springframework.cloud.task.configuration.observation.DefaultTaskObservationConvention`). **Type** `timer`. + +**Metric name** `spring.cloud.task.runner.active` (defined by convention class `org.springframework.cloud.task.configuration.observation.DefaultTaskObservationConvention`). **Type** `long task timer`. + + +IMPORTANT: KeyValues that are added after starting the Observation might be missing from the *.active metrics. + + +IMPORTANT: Micrometer internally uses `nanoseconds` for the baseunit. However, each backend determines the actual baseunit. (i.e. Prometheus uses seconds) + + +Fully qualified name of the enclosing class `org.springframework.cloud.task.configuration.observation.TaskDocumentedObservation`. + +IMPORTANT: All tags must be prefixed with `spring.cloud.task` prefix! + +.Low cardinality Keys +[cols="a,a"] +|=== +|Name | Description +|`spring.cloud.task.runner.bean-name` _(required)_|Name of the bean that was executed by Spring Cloud Task. +|=== + + + + diff --git a/docs/modules/ROOT/partials/_spans.adoc b/docs/modules/ROOT/partials/_spans.adoc new file mode 100644 index 00000000..2bd73430 --- /dev/null +++ b/docs/modules/ROOT/partials/_spans.adoc @@ -0,0 +1,56 @@ +[[observability-spans]] +=== Observability - Spans + +Below you can find a list of all spans declared by this project. + +[[observability-spans-task-active]] +==== Task Active Span + +> Metrics created around a task execution. + +**Span name** `spring.cloud.task` (defined by convention class `org.springframework.cloud.task.listener.DefaultTaskExecutionObservationConvention`). + +Fully qualified name of the enclosing class `org.springframework.cloud.task.listener.TaskExecutionObservation`. + +IMPORTANT: All tags must be prefixed with `spring.cloud.task` prefix! + +.Tag Keys +|=== +|Name | Description +|`spring.cloud.task.cf.app.id` _(required)_|App id for CF cloud. +|`spring.cloud.task.cf.app.name` _(required)_|App name for CF cloud. +|`spring.cloud.task.cf.app.version` _(required)_|App version for CF cloud. +|`spring.cloud.task.cf.instance.index` _(required)_|Instance index for CF cloud. +|`spring.cloud.task.cf.org.name` _(required)_|Organization Name for CF cloud. +|`spring.cloud.task.cf.space.id` _(required)_|Space id for CF cloud. +|`spring.cloud.task.cf.space.name` _(required)_|Space name for CF cloud. +|`spring.cloud.task.execution.id` _(required)_|Task execution id. +|`spring.cloud.task.exit.code` _(required)_|Task exit code. +|`spring.cloud.task.external.execution.id` _(required)_|External execution id for task. +|`spring.cloud.task.name` _(required)_|Task name measurement. +|`spring.cloud.task.parent.execution.id` _(required)_|Task parent execution id. +|`spring.cloud.task.status` _(required)_|task status. Can be either success or failure. +|=== + + + +[[observability-spans-task-runner-observation]] +==== Task Runner Observation Span + +> Observation created when a task runner is executed. + +**Span name** `spring.cloud.task.runner` (defined by convention class `org.springframework.cloud.task.configuration.observation.DefaultTaskObservationConvention`). + +Fully qualified name of the enclosing class `org.springframework.cloud.task.configuration.observation.TaskDocumentedObservation`. + +IMPORTANT: All tags must be prefixed with `spring.cloud.task` prefix! + +.Tag Keys +|=== +|Name | Description +|`spring.cloud.task.runner.bean-name` _(required)_|Name of the bean that was executed by Spring Cloud Task. +|=== + + + + diff --git a/docs/pom.xml b/docs/pom.xml index c1456dc3..52c42cdb 100644 --- a/docs/pom.xml +++ b/docs/pom.xml @@ -1,26 +1,30 @@ - + 4.0.0 + org.springframework.cloud + spring-cloud-task-docs org.springframework.cloud spring-cloud-task-parent 3.1.0-SNAPSHOT - spring-cloud-task-docs + jar Spring Cloud Task Docs Spring Cloud Task Docs spring-cloud-task ${basedir}/.. - spring.cloud.task.* - deploy - 1.5.0-alpha.16 + spring.cloud.* + + none - 1.0.0 - ${maven.multiModuleProjectDirectory}/spring-cloud-task-core + 1.0.2 + ${maven.multiModuleProjectDirectory}/spring-cloud-task-core/ .* - ${maven.multiModuleProjectDirectory}/target/ + ${maven.multiModuleProjectDirectory}/docs/modules/ROOT/partials/ @@ -41,31 +45,34 @@ docs + + + src/main/antora/resources/antora-resources + true + + pl.project13.maven git-commit-id-plugin + org.apache.maven.plugins maven-dependency-plugin - - maven-resources-plugin - org.codehaus.mojo exec-maven-plugin + - generate-docs - prepare-package + generate-observability-docs + ${generate-docs.phase} java - - io.micrometer.docs.DocsGeneratorCommand - + io.micrometer.docs.DocsGeneratorCommand true ${micrometer-docs-generator.inputPath} @@ -85,10 +92,15 @@ - org.asciidoctor - asciidoctor-maven-plugin + io.spring.maven.antora + antora-component-version-maven-plugin + io.spring.maven.antora + antora-maven-plugin + + + org.apache.maven.plugins maven-antrun-plugin diff --git a/docs/src/main/antora/resources/antora-resources/antora.yml b/docs/src/main/antora/resources/antora-resources/antora.yml new file mode 100644 index 00000000..9148923f --- /dev/null +++ b/docs/src/main/antora/resources/antora-resources/antora.yml @@ -0,0 +1,20 @@ +version: @antora-component.version@ +prerelease: @antora-component.prerelease@ + +asciidoc: + attributes: + attribute-missing: 'warn' + chomp: 'all' + project-root: @maven.multiModuleProjectDirectory@ + github-repo: @docs.main@ + github-raw: https://raw.githubusercontent.com/spring-cloud/@docs.main@/@github-tag@ + github-code: https://github.com/spring-cloud/@docs.main@/tree/@github-tag@ + github-issues: https://github.com/spring-cloud/@docs.main@/issues/ + github-wiki: https://github.com/spring-cloud/@docs.main@/wiki + spring-cloud-version: @project.version@ + github-tag: @github-tag@ + version-type: @version-type@ + docs-url: https://docs.spring.io/@docs.main@/docs/@project.version@ + raw-docs-url: https://raw.githubusercontent.com/spring-cloud/@docs.main@/@github-tag@ + project-version: @project.version@ + project-name: @docs.main@ diff --git a/docs/src/main/asciidoc/README.adoc b/docs/src/main/asciidoc/README.adoc index 2cb3623d..02130ce2 100644 --- a/docs/src/main/asciidoc/README.adoc +++ b/docs/src/main/asciidoc/README.adoc @@ -1,3 +1,4 @@ +[[spring-cloud-task]] = Spring Cloud Task Is a project centered around the idea of processing on demand. A user is able to develop @@ -5,10 +6,12 @@ a “task” that can be deployed, executed and removed on demand, yet the resul process persists beyond the life of the task for future reporting. +[[requirements:]] == Requirements: * Java 17 or Above +[[build-main-project:]] == Build Main Project: [source,shell,indent=2] @@ -16,6 +19,7 @@ process persists beyond the life of the task for future reporting. $ ./mvnw clean install ---- +[[example:]] == Example: [source,java,indent=2] @@ -43,9 +47,11 @@ public class MyApp { } ---- +[[code-of-conduct]] == Code of Conduct This project adheres to the Contributor Covenant link:CODE_OF_CONDUCT.adoc[code of conduct]. By participating, you are expected to uphold this code. Please report unacceptable behavior to spring-code-of-conduct@pivotal.io. +[[building-the-project]] == Building the Project This project requires that you invoke the Javadoc engine from the Maven command line. You can do so by appending `javadoc:aggregate` to the rest of your Maven command. diff --git a/docs/src/main/asciidoc/_observability.adoc b/docs/src/main/asciidoc/_observability.adoc deleted file mode 100644 index 01121b26..00000000 --- a/docs/src/main/asciidoc/_observability.adoc +++ /dev/null @@ -1,8 +0,0 @@ -:root-target: ../../../target/ - -[[observability]] -== Observability metadata - -include::{root-target}_metrics.adoc[] - -include::{root-target}_spans.adoc[] diff --git a/docs/src/main/asciidoc/appendix.adoc b/docs/src/main/asciidoc/appendix.adoc deleted file mode 100644 index 7540549e..00000000 --- a/docs/src/main/asciidoc/appendix.adoc +++ /dev/null @@ -1,12 +0,0 @@ - -[[appendix]] -= Appendices - -include::appendix-task-repository-schema.adoc[] - -include::appendix-building-the-documentation.adoc[] - -ifndef::train-docs[] -include::_observability.adoc[] -endif::[] - diff --git a/docs/src/main/asciidoc/index.adoc b/docs/src/main/asciidoc/index.adoc deleted file mode 100644 index 1af1bb98..00000000 --- a/docs/src/main/asciidoc/index.adoc +++ /dev/null @@ -1 +0,0 @@ -include::spring-cloud-task.adoc[]