This is an automated email from the ASF dual-hosted git repository.

hansva pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/hop.git


The following commit(s) were added to refs/heads/main by this push:
     new 7fc393edf5 Bump org.apache.httpcomponents.client5:httpclient5 from 
5.6.1 to 5.6.3 in /plugins/tech/openlineage (#7945)
7fc393edf5 is described below

commit 7fc393edf5c86a2af5ad77272fb9e151d0f4a9e7
Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
AuthorDate: Fri Aug 14 12:19:48 2026 +0200

    Bump org.apache.httpcomponents.client5:httpclient5 from 5.6.1 to 5.6.3 in 
/plugins/tech/openlineage (#7945)
    
    * Bump org.apache.httpcomponents.client5:httpclient5
    
    Bumps 
[org.apache.httpcomponents.client5:httpclient5](https://github.com/apache/httpcomponents-client)
 from 5.6.1 to 5.6.3.
    - 
[Changelog](https://github.com/apache/httpcomponents-client/blob/rel/v5.6.3/RELEASE_NOTES.txt)
    - 
[Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.6.1...rel/v5.6.3)
    
    ---
    updated-dependencies:
    - dependency-name: org.apache.httpcomponents.client5:httpclient5
      dependency-version: 5.6.3
      dependency-type: direct:production
    ...
    
    Signed-off-by: dependabot[bot] <[email protected]>
    
    * use version from hop-libs
    
    ---------
    
    Signed-off-by: dependabot[bot] <[email protected]>
    Co-authored-by: dependabot[bot] 
<49699333+dependabot[bot]@users.noreply.github.com>
    Co-authored-by: Hans Van Akelyen <[email protected]>
---
 plugins/tech/openlineage/README.md | 222 -------------------------------------
 plugins/tech/openlineage/pom.xml   |  25 +----
 2 files changed, 3 insertions(+), 244 deletions(-)

diff --git a/plugins/tech/openlineage/README.md 
b/plugins/tech/openlineage/README.md
deleted file mode 100644
index 72e6ca574f..0000000000
--- a/plugins/tech/openlineage/README.md
+++ /dev/null
@@ -1,222 +0,0 @@
-<!--
-  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.
--->
-
-# Hop OpenLineage Lineage Sink
-
-Apache Hop plugin that implements `ILineageSink` and forwards Hop lineage 
observations to an
-[OpenLineage](https://openlineage.io/) collector. Primary target:
-[Marquez](https://marquezproject.github.io/marquez/).
-
-Relies on the lineage hub SPI in `hop-engine` 
(`org.apache.hop.lineage.spi.ILineageSink`).
-
-> **User documentation** lives in the Hop user manual under *Technology → 
OpenLineage*, including
-> the **dataset identity** rules another lineage producer must match to stitch 
into Hop's graph.
-> This file covers building and hacking on the plugin itself.
-
-## Build
-
-Built as part of the standard Hop reactor. To build and test just this plugin:
-
-```bash
-./mvnw -pl plugins/tech/openlineage clean test
-```
-
-The plugin is **marketplace-optional**: it is not in the default Hop client 
and is installed from
-the marketplace (or from `target/hop-tech-openlineage-*.zip`) into 
`plugins/tech/openlineage`.
-
-```
-plugins/tech/openlineage/hop-tech-openlineage-*.jar
-plugins/tech/openlineage/lib/openlineage-java-*.jar
-plugins/tech/openlineage/lib/openlineage-sql-java-*.jar
-plugins/tech/openlineage/lib/{jackson-datatype-*,httpclient5,micrometer,...}-*.jar
-```
-
-OpenLineage JSON is built and delivered with the official
-[`io.openlineage:openlineage-java`](https://github.com/OpenLineage/OpenLineage)
 client (Apache 2.0),
-so the emitted events are spec-correct by construction. Jackson 
core/databind/annotations,
-commons-lang3 and slf4j are provided by the Hop runtime; the client's 
remaining runtime
-dependencies are bundled into `lib/`.
-
-`openlineage-sql-java` carries prebuilt native libraries for every supported 
platform, which is why
-the packaged plugin is ~24 MB. That is the main reason it ships as an optional 
plugin rather than
-in the default client.
-
-## Enable in Hop
-
-Set these **ENGINE-scoped** variables:
-
-| Variable | Default | Description |
-|----------|---------|-------------|
-| `HOP_LINEAGE_ENABLED` | `N` | Set to `Y` to enable the lineage hub |
-| `HOP_LINEAGE_SINK_IDS` | *(empty)* | Set to `openlineage` to load only this 
sink |
-| `HOP_LINEAGE_QUEUE_CAPACITY` | `10000` | In-memory event queue size |
-| `HOP_LINEAGE_BATCH_MAX` | `100` | Max events per sink batch |
-| `HOP_LINEAGE_BATCH_LINGER_MS` | `250` | Batch linger time (ms) |
-
-### Plugin variables (read in `init()`)
-
-| Variable | Default | Description |
-|----------|---------|-------------|
-| `HOP_LINEAGE_OPENLINEAGE_URL` | *(required)* | Collector URL, e.g. 
`http://marquez-api:5000/api/v1/lineage` |
-| `HOP_LINEAGE_OPENLINEAGE_NAMESPACE` | `hop` | OpenLineage **job** namespace. 
This is *not* the dataset namespace — see the dataset identity page |
-| `HOP_LINEAGE_OPENLINEAGE_PRODUCER` | apache/hop plugin URL | OpenLineage 
`producer` field |
-| `HOP_LINEAGE_OPENLINEAGE_API_KEY` | *(empty)* | Optional bearer token sent 
as `Authorization: Bearer …` |
-| `HOP_LINEAGE_OPENLINEAGE_CONNECT_TIMEOUT_MS` | `5000` | HTTP connect timeout 
|
-| `HOP_LINEAGE_OPENLINEAGE_READ_TIMEOUT_MS` | `30000` | HTTP read/response 
timeout |
-| `HOP_LINEAGE_OPENLINEAGE_BUFFER_SIZE` | `10000` | Async outbound queue 
capacity |
-| `HOP_LINEAGE_OPENLINEAGE_MAX_RETRIES` | `3` | Retries per event on a 
*transient* failure (exponential backoff) |
-| `HOP_LINEAGE_OPENLINEAGE_RETRY_BACKOFF_MS` | `500` | Initial retry backoff; 
doubles each attempt |
-| `HOP_LINEAGE_OPENLINEAGE_OVERFLOW_POLICY` | `DROP` | `DROP` = drop and count 
when the buffer is full; `BLOCK` = wait for capacity (bounded, see below) |
-| `HOP_LINEAGE_OPENLINEAGE_ENQUEUE_TIMEOUT_MS` | `5000` | Under `BLOCK`, how 
long to wait for capacity before dropping |
-| `HOP_LINEAGE_OPENLINEAGE_SHUTDOWN_DRAIN_MS` | `30000` | Max time to drain 
the queue on shutdown |
-| `HOP_LINEAGE_OPENLINEAGE_METRICS_INTERVAL_MS` | `0` | If > 0, log 
`sent/failed/dropped/queued` counts at this interval (`0` = off) |
-| `HOP_LINEAGE_OPENLINEAGE_TRUSTSTORE_PATH` | *(empty)* | Path to a trust/key 
store for HTTPS collectors with a custom CA/cert |
-| `HOP_LINEAGE_OPENLINEAGE_TRUSTSTORE_PASSWORD` | *(empty)* | Store password 
(used with the trust store path) |
-| `HOP_LINEAGE_OPENLINEAGE_KEYSTORE_TYPE` | `PKCS12` | Store type for the 
trust store (e.g. `PKCS12`, `JKS`) |
-| `HOP_LINEAGE_OPENLINEAGE_SQL_PARSE` | `Y` | Parse Table Input / Execute SQL 
statements to recover their source/target tables |
-| `HOP_LINEAGE_OPENLINEAGE_FILE_SPEC_NAMING` | `N` | Name file datasets per 
the OpenLineage naming spec. Off by default because it re-keys existing file 
datasets |
-
-> **Proxy:** the client has no proxy setting; route through a forward proxy 
with the JVM
-> properties `-Dhttps.proxyHost`/`-Dhttps.proxyPort` (or `http.*`) instead.
-
-## Delivery model & limitations
-
-- Events are buffered in an **in-memory** queue and POSTed by a **single 
worker thread**. This
-  preserves run-event ordering (`START` before `COMPLETE`) — the reason 
delivery is not
-  parallelised — and is the throughput ceiling of the sink.
-- **Lineage never becomes a participant in the pipeline.** The engine-side 
emitters swallow their
-  own failures, and the outbound queue **drops by default** rather than 
blocking. The caller of
-  `enqueueAll` is the lineage hub's single dispatcher thread, and a finishing 
pipeline waits on a
-  flush marker that same thread has to process — so blocking there for an 
unreachable collector
-  would delay every pipeline completion, not just lineage. `BLOCK` remains 
available for
-  deployments that would rather lose throughput than lose lineage, and is 
itself bounded by
-  `…_ENQUEUE_TIMEOUT_MS`.
-- On a hard JVM crash, undelivered events in the queue are **lost** (there is 
no on-disk spool).
-  Normal shutdown drains the queue up to `…_SHUTDOWN_DRAIN_MS`.
-- Transient failures (connection errors, 5xx, 408, 429) are retried. A 4xx 
rejection is **not**
-  retried — the collector understood the request and refused it, so resending 
only spends the
-  backoff. Persistent failures are logged and counted.
-
-## Event mapping
-
-| Hop `LineageEventKind` | OpenLineage output |
-|------------------------|-------------------|
-| `RUN_LIFECYCLE` | `RunEvent` — `START` / `COMPLETE` / `FAIL` |
-| `FILE_IO` | `RunEvent` (`OTHER`) with physical file datasets 
(`dataSource.uri` + `schema` when Hop provides `FileIoContentSchema`), 
correlated to the **pipeline** run |
-| `RELATIONAL_IO` | `RunEvent` (`OTHER`) with relational input/output datasets 
keyed by the database identity (`namespace` = `postgres://host:port`, `name` = 
`database.schema.table`), plus `schema`, `columnLineage` and 
`lifecycleStateChange` facets where known, and a `SQLJobFacet` for SQL-bearing 
statements |
-| `TRANSFORM_SCHEMA` | Skipped (Hop internal row shapes between transforms, 
not physical datasets) |
-| `HTTP_IO` | Skipped (debug log only) |
-
-Run id comes from the subject `logChannelId` when present. Job name from 
`pipelineName` or
-`workflowName`; transform subjects use `pipelineName/transformName` so they do 
not collide with the
-pipeline run in Marquez.
-
-**Parent/child runs:** transform run events carry a `ParentRunFacet` pointing 
at their pipeline run,
-and action run events point at their workflow run, so per-transform jobs 
attach to the pipeline run
-in the lineage graph instead of appearing as disconnected jobs.
-
-### Which transforms produce `RELATIONAL_IO`
-
-Transforms do not emit these events themselves. A transform's metadata 
**declares** its table access
-via `@RelationalLineage` plus the `RDBMS_*` property annotations, and the 
engine derives the event
-when the transform finishes (see the *Lineage* page of the developer manual). 
Covered today:
-
-| Transform | Operation | Notes |
-|-----------|-----------|-------|
-| Table Output | write | `OVERWRITE` lifecycle when truncating. Per-row 
dynamic table names are reported by the transform itself, since no annotation 
can describe them |
-| Insert/Update, Update | write | Key columns + updated value columns |
-| Delete | delete | Affected table only — a delete produces no columns, so no 
schema facet |
-| Combination Lookup/Update | write | Key columns; the generated technical key 
has no stream source and is omitted |
-| Dimension Lookup/Update | write | Natural keys + attribute columns; 
generated columns (technical key, version, validity dates) are omitted |
-| PostgreSQL, MySQL, Oracle, Vertica, CrateDB, MonetDB, Redshift, Snowflake 
bulk loaders | write | Explicit field mapping; `OVERWRITE` where the loader 
truncates or replaces |
-| Table Input | read | Source tables recovered by parsing the `SELECT` |
-| Execute SQL | exec | Source and target tables recovered by parsing the 
statement |
-
-Adding a database transform to this list is a matter of annotating its 
metadata; there is no
-emission code to write.
-
-### Dataset identity
-
-The `(namespace, name)` rules — and the naming another producer must match — 
are documented in the
-user manual under *Technology → OpenLineage → Dataset identity*
-(`docs/hop-user-manual/modules/ROOT/pages/technology/openlineage/dataset-identity.adoc`).
 Read it
-before integrating a second lineage producer. It also records two known gaps: 
Snowflake/BigQuery
-namespaces, and identifier casing.
-
-### SQL parsing
-
-Table Output knows its target table directly, but **Table Input** and 
**Execute SQL** only provide a
-SQL statement. The engine therefore emits `RELATIONAL_IO` events carrying the 
raw SQL, and this sink
-recovers the tables by parsing it with the
-[OpenLineage SQL 
parser](https://github.com/OpenLineage/OpenLineage/tree/main/integration/sql)
-(`io.openlineage:openlineage-sql-java`, a Rust core reached over JNI). The 
parser handles JOINs,
-CTEs, subqueries and `INSERT … SELECT`, and the parsed `database.schema.table` 
is fed through the
-same `LineageRelationalIdentity.datasetName` used for writes, so a read and a 
write of the same
-table produce the identical dataset node.
-
-- The native libraries are **bundled per-platform inside the jar**; no 
separate install.
-- **Catalog qualification:** a `SELECT ... FROM schema.table` carries no 
catalog segment (SQL cannot
-  name it), so the sink fills it from the connection's catalog 
(`RELATIONAL_IO.defaultCatalog`, i.e.
-  `DatabaseMeta.getDatabaseName()`), and likewise its preferred schema.
-- Parsing is **best-effort**: an unavailable native library, a statement the 
parser rejects, or a
-  bare table with no schema simply yields no (or coarser) lineage — it never 
fails the read.
-- Toggle with `HOP_LINEAGE_OPENLINEAGE_SQL_PARSE` (default `Y`).
-
-### Column-level lineage
-
-Emitted as the OpenLineage `columnLineage` dataset facet, from two sources:
-
-1. **Parsed SQL** — `INSERT … SELECT` in Execute SQL yields per-field edges 
directly from the
-   parser.
-2. **The pipeline stream path** — a read registers how each of its output 
stream fields maps back to
-   a source table column; a write resolves each target column through the 
transform that produced
-   its stream field (`IValueMeta.getOrigin()`) to the matching read. This 
traces through
-   pass-through transforms, and is deliberately conservative: a column whose 
origin is not a
-   registered read (a computed field, a join with no resolvable source) yields 
**no** edge rather
-   than a guess.
-
-### Known gap: file column schema
-
-Marquez **Fields** on a file dataset come from the OpenLineage `schema` facet 
on `FILE_IO` events.
-The sink maps `FileIoLineagePayload.contentSchema` when present, but
-`org.apache.hop.pipeline.transforms.file.BaseFileInputTransform` still emits 
file reads with
-`contentSchema = null`, so delimited/CSV text inputs show **0 columns**. 
JSON/XML/YAML file
-transforms pass a content schema of their own and are unaffected. Fixing this 
is an engine change
-(build a `FileIoContentSchema` from `data.outputRowMeta` in 
`emitLineageFileRead`), not a plugin
-change.
-
-## Tests
-
-```bash
-./mvnw -pl plugins/tech/openlineage test
-```
-
-- `OpenLineageEventMapperTest` — the event → OpenLineage mapping, including 
the dataset identity
-  rules and column lineage
-- `OpenLineageHttpClientTest` — which delivery failures are retried and which 
are not
-- `OpenLineageAsyncDispatcherTest` — overflow policy (bounded `BLOCK`, counted 
`DROP`) and drain
-- `OpenLineageSinkTest` — the public `ILineageSink` contract 
(init/accept/shutdown) against a
-  WireMock collector: delivery, exact request body, async non-blocking 
`accept`, retry on a
-  transient `503`
-- `RelationalSqlParserTest`, `RelationalColumnLineageCorrelatorTest` — table 
and column recovery
-
-End-to-end coverage against a real Marquez lives in 
`integration-tests/openlineage` and runs with
-`docker/integration-tests/integration-tests-openlineage.yaml`.
-
-## License
-
-Apache License 2.0 (same as Apache Hop).
diff --git a/plugins/tech/openlineage/pom.xml b/plugins/tech/openlineage/pom.xml
index ec2f4299ac..838552c0dc 100644
--- a/plugins/tech/openlineage/pom.xml
+++ b/plugins/tech/openlineage/pom.xml
@@ -31,35 +31,18 @@
     <description>ILineageSink plugin that maps Hop lineage events to 
OpenLineage JSON for Marquez</description>
 
     <properties>
-        <!--
-          openlineage-java brings its own (older) HttpClient5. Pin it to the 
version Hop already
-          ships so the distribution does not end up with two copies of the 
same library.
-        -->
-        
<openlineage.httpclient5.version>5.6.1</openlineage.httpclient5.version>
-        <!--
-          Keep in step with the jackson-databind version managed in the root 
pom: the modules
-          bundled here (datatype-jsr310/jdk8, module-blackbird, 
dataformat-yaml) run against the
-          jackson-core/databind provided by the Hop runtime, so a skew between 
them is a runtime
-          incompatibility rather than a build failure.
-        -->
-        <openlineage.jackson.version>2.21.5</openlineage.jackson.version>
         <openlineage.version>1.46.0</openlineage.version>
     </properties>
 
     <dependencyManagement>
         <dependencies>
             <dependency>
-                <groupId>com.fasterxml.jackson</groupId>
-                <artifactId>jackson-bom</artifactId>
-                <version>${openlineage.jackson.version}</version>
+                <groupId>org.apache.hop</groupId>
+                <artifactId>hop-libs</artifactId>
+                <version>${project.version}</version>
                 <type>pom</type>
                 <scope>import</scope>
             </dependency>
-            <dependency>
-                <groupId>org.apache.httpcomponents.client5</groupId>
-                <artifactId>httpclient5</artifactId>
-                <version>${openlineage.httpclient5.version}</version>
-            </dependency>
         </dependencies>
     </dependencyManagement>
 
@@ -82,8 +65,6 @@
                     <groupId>com.fasterxml.jackson.core</groupId>
                     <artifactId>jackson-annotations</artifactId>
                 </exclusion>
-                <!-- jackson core/databind/annotations, commons-lang3 and 
slf4j are provided by the
-                     Hop runtime; the remaining Jackson modules and 
HttpClient5/micrometer are bundled. -->
                 <exclusion>
                     <groupId>com.fasterxml.jackson.core</groupId>
                     <artifactId>jackson-core</artifactId>

Reply via email to