Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: fetch schema from schema-registry by schema string #308

Open
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

rroesch1
Copy link

@rroesch1 rroesch1 commented Oct 9, 2024

  • enable users to lookup the schema id for a given schema string

@mostafa
Copy link
Owner

mostafa commented Oct 9, 2024

Hey @rroesch1,

Thanks for your contribution! Can you please add a JS script to the examples to test all these cases and add some Go tests?

"schemaType": srclient.Avro,
},
),
},
}).Export().(*Schema)
assert.Equal(t, "test-subject", newSchema.Subject)
assert.Equal(t, 0, newSchema.Version)
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fyi: the first version of a schema should have the version 1 (not 0)

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When we use the client.CreateSchema function in our code, it internally calls the client.GetSchema function from the srclient library. This function interacts with the Schema Registry API endpoint GET /schemas/ids/{id}. According to the API documentation, this endpoint returns the schema associated with a specific ID but does not include the version information in its response. As a result, the version defaults to 0 when you retrieve the schema using these functions.

To obtain the version information of the schema, you should use the getSchema wrapper function like below. This function calls a different endpoint—such as GET /subjects/{subject}/versions/{version} or GET /subjects/{subject}/versions/latest—which provides both the schema and its version information. By using getSchema, you ensure that you retrieve all the necessary details about the schema, including its version.

(We can add this as a comment here)

* enable users to lookup the schema id for a given schema string
Copy link

sonarcloud bot commented Oct 28, 2024

@rroesch1 rroesch1 changed the title feat: fetch schema from schema-regsitry by schema string feat: fetch schema from schema-registry by schema string Oct 28, 2024
Copy link
Owner

@mostafa mostafa left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@rroesch1 Thank a lot for your contribution! 🙏

Please address the comments.

@@ -488,7 +488,8 @@ export class SchemaRegistry {
constructor(schemaRegistryConfig: SchemaRegistryConfig);
/**
* @method
* Get a schema from Schema Registry by version and subject.
* Get latest schema from Schema Registry by subject.
Copy link
Owner

@mostafa mostafa Oct 28, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You only need to update the api-docs/index.d.ts file and then run these commands to generate the docs in the same directory, considering that you haven't installed npm deps:

npm i
npm run validate-d-ts
npm run generate-docs
npm run prettify

@@ -137,8 +137,10 @@ Deserializes the given data and schema into its original form.

▸ **getSchema**(`schema`): [`Schema`](../interfaces/Schema.md)

**`method`**
Get a schema from Schema Registry by version and subject.
**`method`** Get a schema from Schema Registry
Copy link
Owner

@mostafa mostafa Oct 28, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do not change this manually. See my comment on the api-docs/index.d.ts file above.

}
}

runtime := k.vu.Runtime()
// The client always caches the schema.
var schemaInfo *srclient.Schema
var err error
// Default version of the schema is the latest version.
if schema.Version == 0 {
var isLatestSchema = false;
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
var isLatestSchema = false;
var updateCache = false;

schema.Subject, schema.Version)
} else { // fetch latest schema for given subject
schemaInfo, err = client.GetSchemaByVersion(schema.Subject, schema.Version)
isLatestSchema = true;
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
isLatestSchema = true;
updateCache = true;

@@ -306,7 +318,7 @@ func (k *Kafka) getSchema(client *srclient.SchemaRegistryClient, schema *Schema)
Subject: schema.Subject,
}
// If the Cache is set, cache the schema.
if wrappedSchema.EnableCaching {
if wrappedSchema.EnableCaching && isLatestSchema {
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
if wrappedSchema.EnableCaching && isLatestSchema {
if wrappedSchema.EnableCaching && updateCache {

} else {
schemaInfo, err = client.GetSchemaByVersion(
schema.Subject, schema.Version)
} else { // fetch latest schema for given subject
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
} else { // fetch latest schema for given subject
} else { // fetch schema by version

"schemaType": srclient.Avro,
},
),
},
}).Export().(*Schema)
assert.Equal(t, "test-subject", newSchema.Subject)
assert.Equal(t, 0, newSchema.Version)
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When we use the client.CreateSchema function in our code, it internally calls the client.GetSchema function from the srclient library. This function interacts with the Schema Registry API endpoint GET /schemas/ids/{id}. According to the API documentation, this endpoint returns the schema associated with a specific ID but does not include the version information in its response. As a result, the version defaults to 0 when you retrieve the schema using these functions.

To obtain the version information of the schema, you should use the getSchema wrapper function like below. This function calls a different endpoint—such as GET /subjects/{subject}/versions/{version} or GET /subjects/{subject}/versions/latest—which provides both the schema and its version information. By using getSchema, you ensure that you retrieve all the necessary details about the schema, including its version.

(We can add this as a comment here)

assert.Equal(t, "test-subject", newSchema.Subject)
assert.Equal(t, 0, newSchema.Version)
assert.Equal(t, "test-subject", newSchema1.Subject)
assert.Equal(t, 1, newSchema1.Version)
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
assert.Equal(t, 1, newSchema1.Version)
assert.Equal(t, 0, newSchema1.Version)

},
}).Export().(*Schema)
assert.Equal(t, "test-subject", newSchema2.Subject)
assert.Equal(t, 2, newSchema2.Version)
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
assert.Equal(t, 2, newSchema2.Version)
assert.Equal(t, 0, newSchema2.Version)

@@ -271,7 +271,8 @@ func TestGetSubjectNameCanUseRecordNameStrategyWithNamespace(t *testing.T) {
// TestSchemaRegistryClientClass tests the schema registry client class.
func TestSchemaRegistryClientClass(t *testing.T) {
test := getTestModuleInstance(t)
avroSchema := `{"type":"record","name":"Schema","namespace":"com.example.person","fields":[{"name":"field","type":"string"}]}`
avroSchema1 := `{"type":"record","name":"Schema","namespace":"com.example.person","fields":[{"name":"field","type":"string"}]}`
avroSchema2 := `{"type":"record","name":"Schema","namespace":"com.example.person","fields":[{"name":"field","type":"string"}, {"name":"field2","type":"int"}]}`
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I tested this locally and the space causes the tests to fail.

Suggested change
avroSchema2 := `{"type":"record","name":"Schema","namespace":"com.example.person","fields":[{"name":"field","type":"string"}, {"name":"field2","type":"int"}]}`
avroSchema2 := `{"type":"record","name":"Schema","namespace":"com.example.person","fields":[{"name":"field","type":"string"},{"name":"field2","type":"int"}]}`

@mostafa
Copy link
Owner

mostafa commented Nov 22, 2024

Hey @rroesch1,

Would you update this PR with the reviewed changes?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants