MCPcopy Index your code
hub / github.com/castorm/kafka-connect-http

github.com/castorm/kafka-connect-http @v0.8.11

Chat with this repo
repository ↗ · DeepWiki ↗ · release v0.8.11 ↗ · + Follow
765 symbols 2,677 edges 136 files 3 documented · 0%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

Kafka Connect HTTP Connector

Build Codacy Badge FOSSA Status Release to GitHub Release to Maven Central Maven Central

Kafka Connect connector that enables Change Data Capture from JSON/HTTP APIs into Kafka.

This connector is for you if

  • You want to (live) replicate a dataset exposed through JSON/HTTP API
  • You want to do so efficiently
  • You want to capture only changes, not full snapshots
  • You want to do so via configuration, with no custom coding
  • You want to be able to extend the connector if it comes to that

Examples

See examples, e.g. * Jira Issues Search API * Elasticsearch Search API

Getting Started

If your Kafka Connect deployment is automated and packaged with Maven, you can unpack the artifact on Kafka Connect plugins folder.

<plugin>
    <artifactId>maven-dependency-plugin</artifactId>
    <execution>
        <id>copy-kafka-connect-plugins</id>
        <phase>prepare-package</phase>
        <goals>
            <goal>unpack</goal>
        </goals>
        <configuration>
            <outputDirectory>${project.build.directory}/docker-build/plugins</outputDirectory>
            <artifactItems>
                <artifactItem>
                    <groupId>com.github.castorm</groupId>
                    <artifactId>kafka-connect-http</artifactId>
                    <version>0.8.11</version>
                    <type>tar.gz</type>
                    <classifier>plugin</classifier>
                </artifactItem>
            </artifactItems>
        </configuration>
    </execution>
</plugin>

Otherwise, you'll have to do it manually by downloading the package from the Releases Page.

More details on how to Install Connectors.

Source Connector

com.github.castorm.kafka.connect.http.HttpSourceConnector

Extension points

The connector can be easily extended by implementing your own version of any of the components below.

These are better understood by looking at the source task implementation:

public List<SourceRecord> poll() throws InterruptedException {

    throttler.throttle(offset.getTimestamp().orElseGet(Instant::now));

    HttpRequest request = requestFactory.createRequest(offset);

    HttpResponse response = requestExecutor.execute(request);

    List<SourceRecord> records = responseParser.parse(response);

    List<SourceRecord> unseenRecords = recordSorter.sort(records).stream()
            .filter(recordFilterFactory.create(offset))
            .collect(toList());

    confirmationWindow = new ConfirmationWindow<>(extractOffsets(unseenRecords));

    return unseenRecords;
}

public void commitRecord(SourceRecord record, RecordMetadata metadata) {
    confirmationWindow.confirm(record.sourceOffset());
}

public void commit() {
    offset = confirmationWindow.getLowWatermarkOffset()
            .map(Offset::of)
            .orElse(offset);
}

Timer: Throttling HttpRequest

Controls the rate at which HTTP requests are performed by informing the task, how long until the next execution is due.

http.timer

```java public interface Timer extends Configurable {

Long getRemainingMillis();

default void reset(Instant lastZero) {
    // Do nothing
}

} `` * Type:Class* Default:com.github.castorm.kafka.connect.timer.AdaptableIntervalTimer* Available implementations: *com.github.castorm.kafka.connect.timer.FixedIntervalTimer*com.github.castorm.kafka.connect.timer.AdaptableIntervalTimer`

Throttling HttpRequest with FixedIntervalThrottler

Throttles rate of requests based on a fixed interval.

http.timer.interval.millis

Interval in between requests * Type: Long * Default: 60000

Throttling HttpRequests with AdaptableIntervalThrottler

Throttles rate of requests based on a fixed interval. It has, however, two modes of operation, with two different intervals: * Up to date No new records in last poll, or there were new records, but "recently" created (shorter than interval) * Catching up There were new records in last poll, but they were created "long ago" (longer than interval)

http.timer.interval.millis

Interval in between requests when up-to-date

  • Type: Long
  • Default: 60000
http.timer.catchup.interval.millis

Interval in between requests when catching up * Type: Long * Default: 30000


HttpRequestFactory: Creating a HttpRequest

The first thing our connector will need to do is creating a HttpRequest.

http.request.factory

```java public interface HttpRequestFactory extends Configurable {

HttpRequest createRequest(Offset offset);

} `` * Type:Class* Default:com.github.castorm.kafka.connect.http.request.template.TemplateHttpRequestFactory* Available implementations: *com.github.castorm.kafka.connect.http.request.template.TemplateHttpRequestFactory`

http.offset.initial

Initial offset, comma separated list of pairs. * Example: property1=value1, property2=value2 * Type: String * Default: ""

Creating a HttpRequest with TemplateHttpRequestFactory

This HttpRequestFactory is based on template resolution.

http.request.method

Http method to use in the request. * Type: String * Default: GET

http.request.url

Http url to use in the request. * Required * Type: String

http.request.headers

Http headers to use in the request, , separated list of : separated pairs. * Example: Name: Value, Name2: Value2 * Type: String * Default: ""

http.request.params

Http query parameters to use in the request, & separated list of = separated pairs. * Example: name=value & name2=value2 * Type: String * Default: ""

http.request.body

Http body to use in the request. * Type: String * Default: ""

http.request.template.factory

```java public interface TemplateFactory {

Template create(String template);

}

public interface Template {

String apply(Offset offset);

} `` Class responsible for creating the templates that will be used on every request. * Type:Class* Default:com.github.castorm.kafka.connect.http.request.template.freemarker.BackwardsCompatibleFreeMarkerTemplateFactory* Available implementations: *com.github.castorm.kafka.connect.http.request.template.freemarker.BackwardsCompatibleFreeMarkerTemplateFactoryImplementation based on [FreeMarker](https://freemarker.apache.org/) which accepts offset properties withoutoffsetnamespace _(Deprecated)_ *com.github.castorm.kafka.connect.http.request.template.freemarker.FreeMarkerTemplateFactoryImplementation based on [FreeMarker](https://freemarker.apache.org/) *com.github.castorm.kafka.connect.http.request.template.NoTemplateFactory`

Creating a HttpRequest with FreeMarkerTemplateFactory

FreeMarker templates will have the following data model available: * offset * key * timestamp (as ISO8601 string, e.g.: 2020-01-01T00:00:00Z) * ... (custom offset properties)

Accessing any of the above withing a template can be achieved like this:

http.request.params=after=${offset.timestamp}

For an Epoch representation of the same string, FreeMarker built-ins should be used:

http.request.params=after=${offset.timestamp?datetime.iso?long}

For a complete understanding of the features provided by FreeMarker, please, refer to the User Manual


HttpClient: Executing a HttpRequest

Once our HttpRequest is ready, we have to execute it to get some results out of it. That's the purpose of the HttpClient

http.client

```java public interface HttpClient extends Configurable {

HttpResponse execute(HttpRequest request) throws IOException;

} `` * Type:Class* Default:com.github.castorm.kafka.connect.http.client.okhttp.OkHttpClient* Available implementations: *com.github.castorm.kafka.connect.http.client.okhttp.OkHttpClient`

Executing a HttpRequest with OkHttpClient

Uses a OkHttp client.

http.client.connection.timeout.millis

Timeout for opening a connection * Type: Long * Default: 2000

http.client.read.timeout.millis

Timeout for reading a response * Type: Long * Default: 2000

http.client.connection.ttl.millis

Time to live for the connection * Type: Long * Default: 300000


HttpAuthenticator: Authenticating a HttpRequest

When executing the request, authentication might be required. The HttpAuthenticator is responsible for resolving the Authorization header to be included in the HttpRequest.

http.auth

```java public interface HttpAuthenticator extends Configurable {

Optional<String> getAuthorizationHeader();

} `` * Type:Class* Default:com.github.castorm.kafka.connect.http.auth.ConfigurableHttpAuthenticator* Available implementations: *com.github.castorm.kafka.connect.http.auth.ConfigurableHttpAuthenticator*com.github.castorm.kafka.connect.http.auth.NoneHttpAuthenticator*com.github.castorm.kafka.connect.http.auth.BasicHttpAuthenticator`

Authenticating with ConfigurableHttpAuthenticator

Allows selecting the authentication type via configuration property

http.auth.type

Type of authentication * Type: Enum { None, Basic } * Default: None

Authenticating with BasicHttpAuthenticator

Allows selecting the authentication type via configuration property

http.auth.user
  • Type: String
  • Default: ""
http.auth.password
  • Type: String
  • Default: """

HttpResponseParser: Parsing a HttpResponse

Once our HttpRequest has been executed, as a result we'll have to deal with a HttpResponse and translate it into the list of SourceRecords expected by Kafka Connect.

http.response.parser

```java public interface HttpResponseParser extends Configurable {

List<SourceRecord> parse(HttpResponse response);

} `` * Type:Class* Default:com.github.castorm.kafka.connect.http.response.PolicyHttpResponseParser* Available implementations: *com.github.castorm.kafka.connect.http.response.PolicyHttpResponseParser*com.github.castorm.kafka.connect.http.response.KvHttpResponseParser`

Parsing with PolicyHttpResponseParser

Vets the HTTP response deciding whether the response should be processed, skipped or failed. This decision is delegated to a HttpResponsePolicy. When the decision is to process the response, this processing is delegated to a secondary HttpResponseParser.

HttpResponsePolicy: Vetting a HttpResponse
http.response.policy

```java public interface HttpResponsePolicy extends Configurable {

HttpResponseOutcome resolve(HttpResponse response);

enum HttpResponseOutcome {
    PROCESS, SKIP, FAIL
}

} `` * Type:Class* Default:com.github.castorm.kafka.connect.http.response.StatusCodeHttpResponsePolicy* Available implementations: *com.github.castorm.kafka.connect.http.response.StatusCodeHttpResponsePolicy`

http.response.policy.parser
  • Type: Class
  • Default: com.github.castorm.kafka.connect.http.response.KvHttpResponseParser
  • Available implementations:
    • com.github.castorm.kafka.connect.http.response.KvHttpResponseParser
Vetting with StatusCodeHttpResponsePolicy

Does response vetting based on HTTP status codes in the response and the configuration below.

http.response.policy.codes.process

Comma separated list of code ranges that will result in the parser processing the response * Example: 200..205, 207..210 * Type: String * Default: 200..299

http.response.policy.codes.skip

Comma separated list of code ranges that will result in the parser skipping the response * Example: 300..305, 307..310 * Type: String * Defa

Extension points exported contracts — how you extend this code

Core symbols most depended-on inside this repo

Shape

Method 586
Class 130
Interface 45
Enum 4

Languages

Java100%

Modules by API surface

kafka-connect-http/src/test/java/com/github/castorm/kafka/connect/common/ConfigUtilsTest.java36 symbols
kafka-connect-http/src/test/java/com/github/castorm/kafka/connect/http/HttpSourceConnectorConfigTest.java27 symbols
kafka-connect-http/src/test/java/com/github/castorm/kafka/connect/http/HttpSourceTaskTest.java22 symbols
kafka-connect-http/src/test/java/com/github/castorm/kafka/connect/http/request/template/TemplateHttpRequestFactoryConfigTest.java19 symbols
kafka-connect-http/src/test/java/com/github/castorm/kafka/connect/http/response/jackson/JacksonRecordParserConfigTest.java18 symbols
kafka-connect-http/src/test/java/com/github/castorm/kafka/connect/http/response/jackson/JacksonKvRecordHttpResponseParserTest.java16 symbols
kafka-connect-http/src/test/java/com/github/castorm/kafka/connect/http/record/SchemedKvSourceRecordMapperTest.java13 symbols
kafka-connect-http/src/test/java/com/github/castorm/kafka/connect/http/response/jackson/JacksonResponseRecordParserTest.java12 symbols
kafka-connect-http/src/test/java/com/github/castorm/kafka/connect/http/response/jackson/JacksonRecordParserTest.java12 symbols
kafka-connect-http/src/test/java/com/github/castorm/kafka/connect/http/client/okhttp/OkHttpClientConfigTest.java12 symbols
kafka-connect-http/src/main/java/com/github/castorm/kafka/connect/common/ConfigUtils.java12 symbols
kafka-connect-http/src/test/java/com/github/castorm/kafka/connect/http/response/jackson/JacksonSerializerTest.java11 symbols

For agents

$ claude mcp add kafka-connect-http \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact

Ask about this repo answers extend the page