Migration guide
To see the biggest differences please consult the changelog.
In version 1.19.0 (Not released yet)
Flink state and API compatibility
Flink state will be incompatible because of multiple changes that involve state serialization, main of which are:
- updated Kryo serialization library in Flink 2.0
- changes in typing for lists, maps and sets in Flink 2.0
- various code changes in Nussknacker
Refer to Flink release notes for detailed Flink API changes.
Configuration changes
- !135 Improvement: Align EvictableState API
- Removed
EvictableStateFunction, instead of it please use LatelyEvictableStateFunction with implementation of def onTimer - Merged
StateHoldertoLatelyEvictableStateFunction
- Removed
- #7181 #7620 Added designer configuration: stickyNotesSettings
- maxContentLength - max length of a sticky notes content (characters)
- maxNotesCount - optional, max count of sticky notes inside one scenario/fragment (if not set the amount of sticky notes in scenario is not limited)
- enabled - if set to false stickyNotes feature is disabled, stickyNotes cant be created, they are also not loaded to graph
- #7534
shouldVerifyBeforeDeployconfiguration entry available for Flink deployment was renamed toscenarioStateVerification.enabled - #6860 Configuration entry
kafkaEspProperties.forceLatestReadis replaced withkafkaEspProperties.defaultOffsetResetStrategy:- forceLatestRead is missing -> keep defaultOffsetResetStrategy missing or set to "None"
- forceLatestRead: false -> defaultOffsetResetStrategy: "None"
- forceLatestRead: true -> defaultOffsetResetStrategy: "ToLatest"
- #7568 The
process-jsonbutton inprocessToolbarConfigwas renamed toprocess-export - #7590 All
akka.*configuration options andAKKA_*and Akka environment variables were replaced with theirpekko.*andPEKKO_*counterparts - it's enough to do a quick search and replace - #7693 Configuration entry
secondaryEnvironment.remoteConfig.uriis moved tosecondaryEnvironment.uri. - #8042 When adding multiple OpenAPI components,
ComponentPrefixshould be added to distinguish the components. In the new version of the component, OpenAPIServiceshould be selected. For this reason, the existing scenario may not compile. The automatic migration for this parameter is not easy and has to be done manually or through updates in the DB if you can read the swagger service name. - #8116 Improved Kafka metadata caching
- Dependencies for
TopicSelectionStrategy(SchemaRegistryClient, andKafkaConfig) should be passed via constructor. kafkaConfig.topicsExistenceValidationConfig.validatorConfigandkafkaConfig.topicsWithoutSchemaFetchTimeoutwere moved to common Kafka admin configurationkafkaConfig.kafkaAdminConfig- see Kafka integration for more details. The properties were moved as follows:topicsExistenceValidationConfig.validatorConfig.autoCreateFlagFetchCacheTtl->kafkaAdminConfig.cacheConfig.autoCreateTopicSettingExpirationTimetopicsExistenceValidationConfig.validatorConfig.topicsFetchCacheTtl->kafkaAdminConfig.cacheConfig.topicsExpirationTimetopicsExistenceValidationConfig.validatorConfig.adminClientTimeout->kafkaAdminConfig.clientTimeouttopicsWithoutSchemaFetchTimeout->kafkaAdminConfig.clientTimeout
- Dependencies for
- #8523 Kafka components configuration changes:
- Configuration of Kafka components via legacy
modelConfig.kafkaentry is not supported for Flink engine. UsemodelConfig.components.kafka.configinstead. - Configuration of Kafka bootstrap servers via legacy
kafkaAddressis not supported anymore. UsekafkaProperties."bootstrap.servers"instead
- Configuration of Kafka components via legacy
- #8788
globalParameters.explicitUidInStatefulOperatorsoption was removed - now we always set uid to node id in stateful operators - #8842!13
avroKryoGenericRecordSchemaIdSerializationAvro optimization option in Kafka source configuration was replaced with a more capableoptimizedGenericRecordSerialization, which can be used with multiple Schema Registry instances:optimizedGenericRecordSerialization.enabled- same as previousavroKryoGenericRecordSchemaIdSerializationboolean flagoptimizedGenericRecordSerialization.schemaRegistryId- Schema Registry instance identifier - each distinct SR environment should get an explicit ID number; defaults to a hash of SR URL, which will make Flink state incompatible if the address changes
- #9037 Changes around Table-API based Component Providers:
- Component Provider for Table Source and Table Sink - rename from
flinkTableDataSourcetoflinkTableIO - Component Provider for Join and Aggregate components
- renamed from
flinkTableOpstoflinkBatchOps - is no longer loaded by default - no need to disable it for streaming configurations, and for batch configurations,
it can be enabled by
components.flinkBatchOps.disabled: falseconfig undermodelConfig
- renamed from
- Component Provider for Table Source and Table Sink - rename from
- #9231 OpenAPI component supports new optional cache configuration:
cacheFileLocation- path to persisted cache with last valid OpenAPI definitions.- Discovery refresh now uses stale-on-error fallback. If refresh fails, cached definitions are used from memory and, when configured, from file cache.
- Configuration key
openApiServicesDiscoveryCacheTtlwas renamed todiscoveryCacheTtl.
REST API changes
- #7563
ProcessAction.buildInfofield was renamed toProcessAction.modelInfoand is optional now.ProcessActiontype is used inScenarioWithDetails.lastDeployedAction,ScenarioWithDetails.lastStateActionandScenarioWithDetails.lastActionwhich are returned by/processes,/processesDetailsendpoints. It is also used by/components/$id/usagesendpoint - #6860 #7562
- Deploy and cancel http request requires valid json in request body (see
DeployRequestandCancelRequest) instead of plain text, e.g.{"comment": "example text"}. - For KafkaFlinkSource it is possible to provide optional deployment parameter, e.g.
{"comment": "example text", "nodesDeploymentData": {"my_source_node_id": {"offsetResetStrategy": "ToLatest"}}}.
- Deploy and cancel http request requires valid json in request body (see
- #7658
/app/processingtype/reloadendpoint doesn't reload Deployment Managers - #7693 Scenario migration uses
MigrateScenarioRequestDtoV3whereremoteUserNameis removed. To provide username use impersonation mechanism. - #7871
CustomHttpServiceProviderproviding Pekko route was renamed toPekkoCustomHttpServiceProvider. - #7959#9012 Scenario testing API changes:
- Scenario testing API (on path prefix
/scenarioTesting) is refactored, with modified endpoint paths and request/response format - endpoints moved from
/processManagementAPI to/scenarioTestingAPI/test(test with form)/generateAndTest(test with generated data) and merged into a single endpoints/performTest/testto/performTest/testCaseto/performTestCase* introducednew representation of test results, grouped per transition between nodes (toggleable in on API request level)
- Scenario testing API (on path prefix
- #8997 Node IDs were changed to technical UUIDs and separated from user-facing node names:
- Existing scenarios are automatically migrated: previous human-readable node id is moved to node
name, and a new UUID is generated as nodeid. - In scenario JSON and HTTP DTOs, node
idis now technical and stable (UUID), while nodenameis user-editable and should be used for UI-facing text. ValidationResultresponse containsnodeNamesmap (nodeId -> nodeName) to allow clients to render readable node labels.KafkaExceptionInfopayload now containsnodeName, and existingnodeIdfield now contains technical UUID values (not user labels).- Links/query params that point to nodes by id (e.g. visualization URLs with
nodeId=...) now require technical UUIDs. Old links based on former human-readable ids stop matching nodes.
- Existing scenarios are automatically migrated: previous human-readable node id is moved to node
Code API changes
- Runtime parameter validation:
Validator,ParameterValidator, andCustomParameterValidatortrait hierarchies refactored.Validatoris now a sealed trait with noisValidmethod. Two new sub-traits carry the validation logic:CompileTimeValidator— the existingisValid(paramName, expression, value, label)(nodeId)returningValidated[PartSubGraphCompilationError, Unit]. All built-in validators implement this.RuntimeValidator— new;isValid(paramName, expression, value: Any)(nodeId)returningValidated[ParameterRuntimeValidationError, Unit]. Called after expression evaluation at runtime.
CompileTimeParameterValidator extends ParameterValidator with CompileTimeValidatorandRuntimeParameterValidator extends ParameterValidator with RuntimeValidatorare the new intermediate traits.CustomParameterValidatoris now a sealed trait with onlydef name: String. It no longer extendsValidator. Replace usages of the oldCustomParameterValidator(which extendedValidator) with:CustomCompileTimeParameterValidator extends CustomParameterValidator with CompileTimeValidator— compile-time custom validation.CustomRuntimeParameterValidator extends CustomParameterValidator with RuntimeValidator— runtime custom validation.- A class may extend both if it needs to validate at both stages.
CustomParameterValidatorDelegateis renamed toCustomParameterValidatorByNameLoader. JSON serialization format is unchanged — it still encodes/decodes as"type": "CustomParameterValidatorDelegate"with a"name"key.CustomParameterValidatorLoader.resolvednow returnsParameterValidator with WithUnderlyingCustomParameterValidatorinstead ofCustomParameterValidator. Code that previously assignedresolvedto aCustomParameterValidatorvariable must be updated.- New
CustomParameterValidatorByClassLoaderloads aCustomParameterValidatorby fully-qualified class name (used by the@CustomValidatorannotation). It serializes as"type": "CustomParameterValidatorDelegate"with a"className"key. - New
@CustomValidator(classOf[MyValidator])Java annotation inpl.touk.nussknacker.engine.api.validationattaches aCustomParameterValidatorimplementation to a parameter by class (alternative to the existing name-basedCustomParameterValidatorByNameLoader). ParameterValidatorJSON codec rewritten manually (was@ConfiguredJsonCodec).ScenarioPropertyConfigalso receives an explicitDecoderin place of@JsonCodec.
- #8719 Feature: Add possibility to pass trace id to Context
- added optional
traceIdfield atContext, default None - Fro now
RequestResponseSourcetransformsRecord[T]instead T as a record
- added optional
- #8723 Change: Passing
Contextinstead ofContextIdat EagerServiceWithStaticParametersAndReturnType.invoke - #7165
pl.touk.nussknacker.engine.api.deployment.DeploymentManager:- new command
DMPerformSingleExecutionCommand, which must be handled inDeploymentManager.processCommandmethod (handle it the same asDMCustomActionCommandwith actionName=run now) - added new arguments to
def resolveandgetProcessStatemethods (latestVersionId: VersionId,deployedVersionId: Option[VersionId]), which will be provided by Nu when invoking this method
- new command
pl.touk.nussknacker.engine.api.deployment.ProcessStateDefinitionManager:- added new arguments to
def processStatemethod (latestVersionId: VersionId,deployedVersionId: Option[VersionId]) - added new methods with default implementations:
def visibleActions: List[ScenarioActionName]- allows to specify, which actions are applicable to scenario (and consequently should be visible in Designer), by default all previously available actionsdef actionTooltips(processStatus: ProcessStatus): Map[ScenarioActionName, String]- allows to define custom tooltips for actions, if not defined the default is still used
- modified method:
def statusActions(processStatus: ProcessStatus): List[ScenarioActionName]- changed argument, to include information about latest and deployed versions
- added new arguments to
- #7379 Removed CustomAction mechanism. If there were any custom actions defined in some custom DeploymentManager implementation, they should be modified to use the predefined set of actions or otherwise replaced by custom links and handled outside Nussknacker.
- #7368 #7502 Renamed
PeriodicSourceFactorytoEventGeneratorSourceFactory - #7364 The DeploymentManager must implement
def schedulingSupport: SchedulingSupport. If support not added, thenNoSchedulingSupportshould be used. - #7511 Changes around flink-based scenario testing. As an entry point to all migration steps, assume that
FlinkMiniClusterWithServicesis a newFlinkMiniClusterHolder- From perspective of testkit (
TestScenarioRunner.flinkBased) module usageflink-testsmodule doesn't depend onflink-test-utilsmodule. To createFlinkMiniClusterWithServicesfollow steps below. Example migration process is also available in PR with the related change.FlinkSpecinheritance should be removed from test class- Test class should extend
BeforeAndAfterAll FlinkMiniClusterWithServicesshould be created usingval flinkMiniClusterWithServices = FlinkMiniClusterFactory.createUnitTestsMiniClusterWithServices()FlinkMiniClusterWithServicesshould be closed inafterAllblock
- From perspective of
flink-test-utilsmodule usage follow steps below. Example migration process is also available in PR with the related change. Caution: this module is deprecated; to avoid further migrations issues, tests should be rewritten to testkit stack- Instead of using
FlinkSpec.flinkMiniCluster.createExecutionEnvironmentmethod, should be usedFlinkSpec.flinkMiniCluster.withDetachedStreamExecutionEnvironmentwhich properly closes created environment MiniClusterExecutionEnvironmentclass was removed, plainStreamExecutionEnvironmentis returned instead- To access methods such as
withJobRunning, importScalatestMiniClusterJobStatusCheckingOps._and then invoke these methods onflinkMiniCluster - Method
withJobRunningwas renamed towithRunningJoband it doesn't invokeStreamExecutionEnvironment.execute. It should be called before this method - Method
executeAndWaitForFinishedwas renamed towaitForJobIsFinishedand it doesn't invokeStreamExecutionEnvironment.execute. It should be called before this method; also, this method cancel job if check ended up with error now - Method
assertJobNotFailingwas renamed tocheckJobIsNotFailing - Some methods are not available in
ScalatestMiniClusterJobStatusCheckingOps:executeAndWaitForStart,waitForStart,stopJob- should be usedwithRunningJob/waitForJobIsFinishedorFlinkMiniClusterWithServices.miniClustermethods directly instead- Other methods were considered too much low-level and were removed
- To access methods such as
- Instead of using
ResultsCollectingListenerHolder.registerListenerorResultsCollectingListenerHolder.registerTestEngineListenershould be usedwithListener/withTestEngineListenermethods which properly cleanup allocated resources.
- Instead of using
- From perspective of testkit (
- #7540
FlinkStreamingDeploymentManagerProviderwas renamed toFlinkDeploymentManagerProvider,FlinkStreamingRestManagerandFlinkRestManagerabstraction layers were removed - onlyFlinkDeploymentManagerexists - #7563
ProcessConfigCreator.buildInfoandNkGlobalParameters.buildInfowere renamed tomodelInfoAlso, they return aModelInfovalue class now. To create it fromMap, useModelInfo.fromMap. To access underlying map, useModelInfo.parameters. - #7566 Scenario status and deployment statuses are decoupled now
- Changes in
DeploymentManagerinterfaceDeploymentManagerhas onlygetScenarioDeploymentsStatusesmethod (previousgetProcessStatesreturningList[StatusDetails]).- Method
DeploymentManager.resolveshould be removed - this work is done by Designer itself DeploymentManagerInconsistentStateHandlerMixInmixin should be also removedstateQueryForAllScenariosSupportwas renamed todeploymentsStatusesQueryForAllScenariosSupport
- Other changes:
StatusDetailswas renamed toDeploymentStatusDetails- Fields:
externalDeploymentId,externalDeploymentId,attributes,attributeswere removed fromStatusDetails
- Changes in
- #7658
DeploymentManageris not reloaded during processing type reloadDeploymentManagerProvider.createDeploymentManager()takesBaseModelDataProviderinstead ofBaseModelData- To access
modelClassLoaderuseBaseModelDataProvider.modelClassLoader - To access other fields from
ModelData, useBaseModelDataProvider.getCurrentModelData() - To create
BaseModelDataProviderfromModelDatauseBaseModelData.toModelDataProviderextension method
- To access
- #7598 Classes from
pl.touk.nussknacker.engine.sttppackage were moved topl.touk.nussknacker.http.backend - #7586 Renamed ComponentUseCase to ComponentUseContext.
- Moved NodeDeploymentData from FlinkCustomNodeContext to ComponentUseContext.LiveRuntime.
- Introduced ComponentUseContextProvider in ScenarioCompiler, which retains ComponentUseCase functionality but is now intended for internal use only.
- #7618
NonTransientExceptionis a normal class instead of case class. We recommend to create explicit classes extending this class, but still it can be created directly but withnew NonTransientException(...) - #7590 Akka and Akka HTTP were replaced with Apache Pekko 1.0.3 / Apache Pekko HTTP 1.0.1.
These versions are API-compatible with previously used Akka versions, so after updating dependencies it should be enough
to replace all
akka.*imports withorg.apache.pekko.*and change theakkaprefix in configuration entries topekko. More details can be found in: - #7632 Simplified parameter editors API.
- Removed the single
editorfrom the UIParameter and now only theeditorsproperty is available. - Replaced the
editorparameter witheditorsin the engine APIParameter. - Similarly,
ParameterConfigin engine API now accepts aneditorslist instead of a single editor. - Removed a
DualEditorfrom the components API.- Renamed a
SimpleEditorto theEditorin components API. - For now on, you can add multiple editors on a single param. The first editor annotation is treated as a default editor.
- Renamed a
- Removed the single
- #7711 #7984
TypingResultAPI changes:TypedNull.wihoutValuereturnsUnknowntype instead ofTypedNullcanBeConvertedTorenamed tocanBeLooselyAssignedTocanBeStrictlyConvertedTorenamed tocanBeStrictlyAssignedTo
- #7768
ModelData.withThisAsContextClassLoaderwas renamed towithModelClassloaderAsContextClassLoader- New,
DeploymentManager.scenarioCompilationDependenciesResourcemethod was added. For flink-based DMs it should be implemented asminiClusterWithServices.createDetachedStreamExecutionEnvironment[SyncIO].map(new FlinkScenarioCompilationDependencies(_))
- #7824 Introduced Json display for
Unknowntype.Unknownis a case class now and it hasDisplayStrategyfield. It affects how the type is displayed.- There is
Unknownobject which extends the case class withDefaultDisplayStrategyfor compatibility. - When introducing new pattern matches regarding types
Unknown(_)should be used so all display strategies are targeted.
- #8054
ProcessObjectDependenciesclass was replaced byModelConfig - #8256 The support for kafka source generating custom classes (
KafkaSourceFactory) was removed We recommend a migration to more generic approach:UniversalKafkaSourceFactory - #8308
ToJsonEncoderrefactor:ToJsonEncoderwas moved topl.touk.nussknacker.engine.api.json.encoderspackageToJsonEncoderis a sealed trait, if you want to extend it, use eitherStrictToJsonEncoder(oldfailOnUnknown = true) orLooseToJsonEncoder(oldfailOnUnknown = false)highPrioritybecome a method instead of parameterToJsonEncoder.encodemethod now returnsValidatedand is available only forStrictToJsonEncoderToJsonEncoder.encodeUnsafemethod behave as the previousToJsonEncoder.encode(errors are thrown as Exceptions)
- #8523 Kafka components configuration changes:
KafkaConfigwas renamed toKafkaComponentsConfigKafkaComponentsConfig.kafkaPropertiesis mandatory nowKafkaComponentsConfig.kafkaAddresswas removed
- #8576
NodeIdvalue class become used more frequently in the API:NodeComponentInfo,ContextId,ProcessCompilationError,ProcessListenerandFlinkCustomNodeContext - #8997 Node identity semantics changed in API modules:
NodeIdshould be treated as internal technical identity (UUID) and not shown to end users as a readable label.NodeNameis now the user-facing label; for user-visible errors/logs/messages useNodeName, optionally withNodeIdonly as technical details.- If your custom code (including integrations based on
*-apimodules) assumednodeId == displayed node name, it must be updated to use both fields explicitly. - In places where you serialize/deserialize scenario-related HTTP payloads, ensure mappings preserve both
idandnamefields.
- #8632
DynamicComponent's[T]generic parameter was replaced withImplementationtype We recommend to not invokeDynamicComponent.implemenation()method directly. To check how component behave during compilation, useTestNodeCompilerinstead. Read Testing for more info. - #8781
WithExceptionHandlerhelper trait was removed because it made it easy to unintentionally hide original class'closemethod - #8778 #8777 Legacy Flink 1.x APIs removal
- Custom, Nussknacker's
TimestampWatermarkHandlerabstraction was replaced by Flink'sWatermarkStrategyFlinkSourceTestSupport.timestampAssignerForTestwas renamed towatermarkStrategyForTestCustomizableTimestampWatermarkHandlerSourcewas renamed toCustomizableWatermarkStrategySource[Raw]StandardTimestampWatermarkHandlerwas renamed toWatermarkStrategyUtils- Nussknacker's
SimpleSerializableTimestampAssignerwas removed - use Flink'sSimpleSerializableTimestampAssignerinstead
AssignerWithPunctuatedWatermarks/AssignerWithPeriodicWatermarksinterfaces were removed from Nussknacker APIBlockingQueueSourcenow takesextractTimestampFun: T => Long, maxOutOfOrderness: Durationinstead ofAssignerWithPunctuatedWatermarks[T]EmitWatermarkAfterEachElementCollectionSourcewas removed. UseCollectionSourcecombined withWatermarkStrategyUtils.afterEachEventBoundedOutOfOrdernessPunctuatedExtractorwere removed - useWatermarkStrategyUtils.afterEachEventinsteadBoundedOutOfOrderPreviousElementAssignerwas removed - use customWatermarkStrategyinstead
BasicFlinkSink.toFlinkFunctionwas replaced bytoFlinkSink; the new method returnssink2.Sinkinstead ofSinkFunction
- Custom, Nussknacker's
- #8788
ExplicitUidInOperatorsSupporttrait was removed. UsesetUidAndNameToNodeIdextension method available inDataStreamImplicitsinstead - #8786
StandardFlinkSource,BaseFlinkSourceandCustomizableWatermarkStrategySourcetraits were removed. UsesetUidAndNameToNodeId,assignTimestampsAndWatermarksand context initialization (FlinkContextInitializingFunction) directly - #9327
FileSystemBindand associated bind mounting helpers in Docker tests were removed. UseContainerVolumeinstead.
Other changes
- #7116 Improve missing Flink Kafka Source / Sink TypeInformation
- We lost support for old ConsumerRecord constructor supported by Flink 1.14 / 1.15
- If you used Kafka source/sink components in your scenarios then state of these scenarios won't be restored
- #8997 Operational impact of random/stable technical node IDs:
- During first migration of existing scenarios, node ids change to UUIDs, so external tools comparing scenario JSON by node ids can observe large one-time diffs.
- Migration
NodeIdToUuidMigrationmust be applied in model migration list, so legacy scenarios are migrated to UUID-based node ids. - Metrics dimensions based on
nodeIdchanged to UUID values. If dashboards/alerts used former human-readable ids, they require updates. Where available, prefernodeNamemetric tag for human-readable presentation. - Kafka consumer groups using naming strategy containing
nodeId(e.g.processId-nodeId) will change identifiers after migration. This can require offsets migration / planned cutover. - Flink operator UIDs are now based on technical node IDs. For scenarios migrated from old ids, savepoints/checkpoints created before migration can become incompatible.
- #7257 #7259
components-apimodule doesn't depend onasync-http-client-backend-future,http-utilsmodule is delivered byflink-executorandlite-runtimemodules. If your component had compile-time dependency tohttp-utils, it should be replaced by provided scope If your component relied on the fact thatcomponents-apidepends onasync-http-client-backend-future,async-http-client-backend-futureshould be added as a provided dependency - #7347 All calls to
org.apache.flink.api.common.functions.RichFunction.open(Configuration), which is deprecated, were replaced with calls toorg.apache.flink.api.common.functions.RichFunction.open(OpenContext) - #7364
- additional, necessary, db schema changes concerning the periodic/scheduling mechanism introduced in #7519
- additionally modified in #7552
- the PeriodicDeploymentManager is no longer a separate DM type
- in
scenarioTypesconfig section, thedeploymentConfigof a periodic scenario type (only Flink was supported so far) may have looked like that:
deploymentConfig: {
type: "flinkPeriodic"
restUrl: "http://jobmanager:8081"
deploymentManager {
db: { <config of the custom db data source> },
processingType: streaming,
jarsDir: ./storage/jars
}
}- changes:
- the
type: "flinkPeriodic"is no longer supported, insteadtype: "flinkStreaming"with additional settingsupportsPeriodicExecution: trueshould be used - the db config is now optional - the periodic DM may still use its custom datasource defined here in
legacyDbsection - when custom
dbsection not defined here, then main Nussknacker db will be used
- the
- config after changes may look like that:
deploymentConfig: {
type: "flinkStreaming"
scheduling {
enabled: true
processingType: streaming
jarsDir: ./storage/jars
}
restUrl: "http://jobmanager:8081"
} - #7335 Deployment managers are loaded using separate class loader (not the Application ClassLoader -
/opt/nussknacker/managers/*should be removed from CLASSPATH definition). The default location for deployment managers jars is themanagersfolder inside the working directory. - #7458 #7534 Flink scenario testing mechanism and scenario state verification mechanism changes
- Scenario testing and scenario state verification is now limited by a timeout to ensure proper resources cleaning. In some cases it might be needed to change the timeout
value. To do that, set
deploymentConfig.scenarioTesting.timeoutor/anddeploymentConfig.scenarioStateVerification.timeoutto desired values. Notice that this properties should be configured along withakka.http.server.request-timeout
- Scenario testing and scenario state verification is now limited by a timeout to ensure proper resources cleaning. In some cases it might be needed to change the timeout
value. To do that, set
- #7468 When a namespace is configured, Kafka consumer groups are also namespaced.
This change should have been introduced as of starting from Nussknacker 1.15 when a feature flag
useNamingStrategyForConsumerGroupIdwas removed to temporarily disable consumer group namespacing. - #7578 Component labels will be auto-generated for all components that don't have
labeldefined inComponentDefinition. Labels will be visible in components palette and in components list. Auto-generated label is created by formating component's name into Title Case, e.g. for component with nameaggregate-session, label will beAggregate Session. If component provider hascomponentPrefixset, it'll be included in auto-generated label. - #7553 #8011
#keyvariable created in window components won't be a list in a string, but it'll have provided types, e.g. instead of"[12.0, ab]"it'll now be[12.0, "ab"]. To keep#keyvalue as before, you'll need to embrace previous values inside curly braces and add.toString, e.g.#input.a#input.b->{#input.a, #input.b}.toString. Also, if you provide one element ingroupByexpression, it will be presented as one element list instead of scalar. - #8011 During scenario compilation, redundant parameters used in node are treated only as warning now. They are skipped and compilation passes.
- #8198 Support for test data without
sourceIdspecified is removed - now, you always have to specify it - #7137#8317 Updated Flink 1.19.2 -> 1.20.2.
- #8209 Nussknacker now requires flink to be run with replaced
lib/flink-scala_2.12-x.x.x.jarbypl.touk:flink-scalalib for the same scala version as used Nussknacker distribution. We provide prebuild flink docker images on Docker Hub - #8478 The behavior of
enumto json encoding has been changed - now it uses.name()instead of.toString() - #8842!13
pl.touk.nussknacker.engine.flink.api.serialization.SerializersRegistrarSPI was moved topl.touk.nussknacker.engine.flink.api.typeinformation.SerializersRegistrar - #8943
spring-jclwas replaced withcommons-logging- projects depending on Nu should update their exclusion rules - #9336
WithKafkaContainerandWithSchemaRegistryContainertest traits were moved from Flink-specificnussknacker-flink-test-utilstonussknacker-kafka-test-utils, methods for accessing service addresses were moved into properContainerobjects - !13
SerializersRegistrarSPI was restored in a new namespace, aspl.touk.nussknacker.engine.flink.api.typeinformation.SerializersRegistrar
In version 1.18.0
Configuration changes
-
- Button name for 'test adhoc' was renamed from
test-with-formtoadhoc-testingIf you are using custom button config remember to update button type totype: "adhoc-testing"inprocessToolbarConfig
- Button name for 'test adhoc' was renamed from
-
- Scenario Activity audit log is available
- logger name,
scenario-activity-audit, it is optional, does not have to be configured - it uses MDC context, example of configuration in
logback.xml:
<logger name="scenario-activity-audit" level="INFO" additivity="false">
<appender-ref ref="STDOUT_FOR_SCENARIO_ACTIVITY_AUDIT"/>
</logger>
<appender name="STDOUT_FOR_SCENARIO_ACTIVITY_AUDIT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - [scenarioId=%X{scenarioId}][version=%X{scenarioVersionId}][user=%X{username}] %msg%n</Pattern>
</encoder>
</appender> -
#6979 Add
type: "activities-panel"to theprocessToolbarConfigwhich replaces removed{ type: "versions-panel" }{ type: "comments-panel" }and{ type: "attachments-panel" } -
#6958 Added message size limit in the "Kafka" exceptionHandler:
maxMessageBytes. Its default value reflects Kafka's default size limit of 1 MB (max.message.bytes), you need to increase it if your error topic allows for larger messages. Remember to add some margin for Kafka protocol overhead (100 bytes should be enough).
Code API changes
- #6971
DeploymentManagerDependenciesAPI changes:- Added field
scenarioActivityManager: ScenarioActivityManager scenarioActivityManagercan be used by anyDeploymentManagerto save scenario activities in the Nu database- there is
NoOpScenarioActivityManagerimplementation available (if needed for tests etc.)
- Added field
- #6971
DeploymentManagercompatible API changes:DeploymentManagermay now optionally extendManagerSpecificScenarioActivitiesStoredByManager- managers extending that trait may internally handle some manager-specific ScenarioActivities and may be queried about those custom activities
- #6695
SingleTypingResultAPI changes:- Renamed
objTypetoruntimeObjTypewhich indicates a current object in a runtime.
- Renamed
- #6766
- Process API changes:
- Field
ScenarioWithDetails.labelswas added - Field
ScenarioWithDetails.tagswas removed (it had the same value aslabelsand was not used)
- Field
- Process API changes:
- #6988 Removed unused API classes:
MultiMap,TimestampedEvictableStateFunction.MultiMapwas incorrectly handled by Flink's default Kryo serializer, so if you want to copy it to your code you should write and register a proper serializer. - #7162 When component declares that requires parameter with either
SpelTemplateParameterEditororSqlParameterEditoreditor, in the runtime, for the expression evaluation result, will be used the newTemplateEvaluationResultclass instead ofStringclass. To access the previousStringuseTemplateEvaluationResult.renderedTemplatemethod. - #7246
- Typing api changes:
- CanBeSubclassDeterminer.canBeSubclassOf changed to AssignabilityDeterminer.isAssignableLoose.
- TypingResult.canBeSubclassOf changed to TypingResult.canBeConvertedTo
- Typing api changes:
REST API changes
- #6944
- New endpoint
/api/scenarioTesting/{scenarioName}/adhoc/validate
- New endpoint
- #6766
- Process API changes:
- PUT
/api/processes/{processName}- optionalscenarioLabelsfield added
- PUT
- Migration API changes:
- POST
/api/migratesupports v2 request format (withscenarioLabelsfield)
- POST
- Process API changes:
- #7021
- Definitions API changes:
- GET
/api/processDefinitionData/*}- added optional query param
enrichedWithUiConfig - added
requiredParamproperty to the response for parameter config atcomponents['component-id'].parameters[*]
- added optional query param
- GET
- Definitions API changes:
- #7246 Changes in DictApiEndpoints:
DictListRequestDtoexpectedType: TypingResultInJson -> Json
Other changes
-
#6692 Kryo serializers for
UnmodifiableCollection,scala.Productetc. are registered based on class of Serializer instead of instance of Serializer. If you have values that were serialized by these Serializers in some state, the state won't be restored after upgrade. -
#6952 Improvement: TypeInformation support for scala.Option: If you used CaseClassTypeInfoFactory with case classes that contain the Option type, the state won't be restored after the upgrade.
-
#6805 Updated Flink 1.18.1 -> 1.19.1. Due to backwards incompatible changes in this Flink version update, Nussknacker 1.18 will not work with Flink versions pre-1.19 right away. If you want to keep using Flink pre-1.19 with current Nussknacker, please refer to compatibility providing plugins in https://github.com/TouK/nussknacker-flink-compatibility.
-
#6912 Improvement: Make TimeMeasuringService usable with other Lifecycle traits
- Services that use
TimeMeasuringServicemust be rebuilt
- Services that use
-
Performance optimization:
- #7058 Add missing Flink TypeInformation for better serialization
- In case of using base (bounded and unbounded) Flink components state will be probably not compatible
FlinkCustomNodeContext.typeInformationDetectionhas been removed, please useTypeInformationDetection.instanceinsteadFlinkCustomNodeContext.forCustomContexthas been removed, please useTypeInformationDetection.instance.forValueWithContextinstead
- #7097 Flink base types registration mechanism
- In case of using types: java.time.LocalDate, java.time.LocalTime, java.time.LocalDateTime with CaseClassTypeInfo mechanism, state probably will be lost
- #7058 Add missing Flink TypeInformation for better serialization
-
#7113 Scala 2.13 was updated to 2.13.15, you should update your
flink-scala-2.13to 1.1.2 -
#7187 JSON decoding in
requestsource (request-response processing mode) and inkafkasource (streaming processing mode): For small decimal numbers is used eitherIntegerorLong(depending on number size) instead ofBigDecimal. This change should be transparent in most cases as this value was mostly used after#CONV.toNumber()invocation which still will return aNumber.
In version 1.17.0
Code API changes
- #6248 Removed implicit conversion from string to SpeL
expression (
pl.touk.nussknacker.engine.spel.Implicits). The conversion should be replaced bypl.touk.nussknacker.engine.spel.SpelExtension.SpelExpresion.spel. - #6282 If you relied on the default value of the
topicsExistenceValidationConfig.enabledsetting, you must now be aware that topics will be validated by default (Kafka'sauto.create.topics.enablesetting is only considered in case of Sinks). Create proper topics manually if needed. - Component's API changes
- #6711
SingleComponentConfigchanged toComponentConfigfor better domain naming. Associated functions and objects also changed to...ComponentConfig.... - #6418 Improvement: Pass implicit nodeId to
EagerServiceWithStaticParameters.returnTypeNow methodreturnTypefromEagerServiceWithStaticParametersrequires implicit nodeId param - #6462
CustomStreamTransformer.canHaveManyInputsfield was removed. You don't need to implement any other method in replacement, just remove this method. - #6418 Improvement: Pass implicit nodeId to
EagerServiceWithStaticParameters.returnType- Now method
returnTypefromEagerServiceWithStaticParametersrequires implicit nodeId param
- Now method
- #6340
TestRecordParsertrait used inSourceTestSupporttrait changed to work on lists instead of single records - itsparsemethod now takesList[TestRecord]instead of a singleTestRecordand returns a list of results instead of a single result. - #6520
ExplicitTypeInformationSourcetrait was removed - nowTypeInformationproduced bySourceFunctionpassed toStreamExecutionEnvironment.addSourceis detected based onTypingResult(thanks toTypeInformationDetection)BlockingQueueSource.createtakesClassTagimplicit parameter instead ofTypeInformationEmitWatermarkAfterEachElementCollectionSource.createtakesClassTagimplicit parameter instead ofTypeInformationCollectionSource'sTypeInformationimplicit parameter was removedEmptySource'sTypeInformationimplicit parameter was removed
- #6545
FlinkSink.prepareTestValuewas replaced byprepareTestValueFunction- a non-parameter method returning a function. Thanks to that,FlinkSinkis not serialized during test data preparation.
- #6711
TypingResultAPI changes- #6436 Changes to
TypingResultof SpEL expressions that are maps or lists:TypedObjectTypingResult.valueOptnow returns ajava.util.Mapinstead ofscala.collection.immutable.Map- NOTE: selection (
.?) or operations from the#COLLECTIONShelper cause the map to lose track of its keys/values, reverting itsfieldsto an empty Map
- NOTE: selection (
- SpEL list expression are now typed as
TypedObjectWithValue, with theunderlyingTypedClassequal to theTypedClassbefore this change, and withvalueequal to ajava.util.Listof the elements' values.- NOTE: selection (
.?), projection (.!) or operations from the#COLLECTIONShelper cause the list to lose track of its values, reverting it to a value-lessTypedClasslike before the change
- NOTE: selection (
- #6566
TypedObjectTypingResult.fieldsare backed byListMapfor correctRowTypeInfo's fields order purpose. If #5457 migrations were applied, it should be a transparent change- Removed deprecated
TypedObjectTypingResult.applymethods - should be usedTyped.recordfactory method Typed.recordfactory method takesIterableinstead ofMap
- Removed deprecated
- #6570
TypingResult.canBeSubclassOfgeneric parameter checking related changes. Generic parameters ofTyped[java.util.Map[X, Y]],Typed[java.util.List[X]],Typed[Array[X]]were checked as they were either covariant or contravariant. Now they are checked more strictly - depending on collection characteristic.Keyparameters ofTyped[java.util.Map[Key, Value]]is treated as invariantValueparameters ofTyped[java.util.Map[Key, Value]]is treated as covariantElementparameters ofTyped[java.util.List[Element]]is treated as covariantElementparameters ofTyped[Array[Element]]is treated as covariant
- #6436 Changes to
- #6503
FlinkTestScenarioRunnercleanupsrunWithDataAndTimestampAssignermethod was removed. Instead,timestampAssignerwas added as an optional parameter intorunWithData- new
runWithDataWithTypewas added allowing to test using other types than classes e.g. records
- #6567 Removed ability to set Flink's execution mode
in sources:
TableSource,CollectionSourceand inFlinkTestScenarioRunner.runWithDatamethod. Now you can configure it undermodelConfig.executionModeor for test purposes throughFlinkTestScenarioRunnerBuilder.withExecutionModemethod. - #6610 Add flink node context as parameter to BasicFlinkSink.
Now one can use
FlinkCustomNodeContextin order to build sink inBasicFlinkSink#toFlinkFunctionmethod. - #6635 #6643
TypingResultTypeInformationrelated changesTypingResultAwareTypeInformationCustomisationAPI was removedFlinkCustomNodeContext.typeInformationDetectionis deprecated - useTypeInformationDetection.instanceinsteadFlinkCustomNodeContext.valueWithContextInfo.forCustomContextis is deprecated - useTypeInformationDetection.instance.forValueWithContextinstead
- #6640
BestEffort*Encodernaming changes:- All
BestEffort*Encoderclasses renamed to fitTo<TargetFormat>(SchemaBased)Encodernaming schema JsonToNuStructrenamed toFromJsonDecoder(to fitFrom<SourceFormat>Decodernaming schema)ToJsonEncoderrenamed toToJsonEncoderCustomisationToJsonBasedOnSchemaEncoderrenamed toToJsonSchemaBasedEncoderCustomisation
- All
- #6586 For now on, the SQL enricher automatically converts types as shown below:
- java.sql.Array -> java.util.List
- java.sql.Time -> java.time.LocalTime
- java.sql.Date -> java.time.LocalDate
- java.sql.Timestamp -> java.time.Instant
- java.sql.Clob -> java.lang.String
REST API changes
- #6437 Removed deprecated operation to create a scenario:
POST
/api/processes/{name}/{category}. POST/api/processesshould be used instead. - #6213 Improvement: Load resource config only in test context
WithConfigfromtest-utilsmodules behaviour changes: now it only parses given config, without resolving reference configs, system env variables etc.
Configuration changes
- #6635
globalParameters.useTypingResultTypeInformationparameter was removed. Now we always use TypingResultTypeInformation - #6797
AVRO_USE_STRING_FOR_STRING_TYPEenvironment variable is not supported anymore - we always use String for String type in Avro. If you didn't set up this environment variable, no action is needed
In version 1.16.3
Code API changes
- #6527 Changes to
TypingResultof SpEL expressions that are maps or lists:TypedObjectTypingResult.valueOptnow returns ajava.util.Mapinstead ofscala.collection.immutable.Map- NOTE: selection (
.?) or operations from the#COLLECTIONShelper cause the map to lose track of its keys/values, reverting itsfieldsto an empty Map
- NOTE: selection (
- SpEL list expression are now typed as
TypedObjectWithValue, with theunderlyingTypedClassequal to theTypedClassbefore this change, and withvalueequal to ajava.util.Listof the elements' values.- NOTE: selection (
.?), projection (.!) or operations from the#COLLECTIONShelper cause the list to lose track of its values, reverting it to a value-lessTypedClasslike before the change
- NOTE: selection (
In version 1.16.0
Code API changes
- #6184 Removed
Remote[]string part from forwarded username for scenario creation and updates.processesandprocess_versionstables won't store username with this part anymore increatedByandmodifiedBycolumns. - #6053 Added impersonation mechanism:
OverrideUsernamepermission was renamed asImpersonateand is now used as a global permission.AuthManageris now responsible for authentication and authorization.AuthenticationResourceshandles only plugin specific authentication now. This leads to following changes inAuthenticationResourcesAPI:authenticate()returnsAuthenticationDirective[AuthenticatedUser]and notDirective1[AuthenticatedUser]authenticate(authCredentials)receivesPassedAuthCredentialsparameter type instead ofAuthCredentialsas anonymous access is no longer part ofAuthenticationResourceslogicauthenticationMethod()returnsEndpointInput[Option[PassedAuthCredentials]]instead ofEndpointInput[AuthCredentials]. TheOption[PassedAuthCredentials]should hold the value that will be passed to the mentionedauthenticate(authCredentials).AuthenticationResourcesextendsAnonymousAccessSupporttrait:AnonymousAccessSupporthas one methodgetAnonymousRole()which returns anonymous role name. If you do not want to have an anonymous access mechanism for your authentication method you can extend yourAuthenticationResourcesimplementation withNoAnonymousAccessSupporttrait.
AuthenticationResourceshas a fieldimpersonationSupportof typeImpersonationSupport:ImpersonationSupportis a trait stating whether authentication method supports impersonation. If you don't want impersonation support you can assignNoImpersonationSupportobject to it. If you wish to have it - assignImpersonationSupportedabstract class to it and implementgetImpersonatedUserData(impersonatedUserIdentity)method which returns required user's data for the impersonation by user'sidentity.
AnonymousAccessextendingAuthCredentialswas renamed toNoCredentialsProvided. It does not represent anonymous access to the designer anymore but simply represents passing no credentials.AuthenticationConfigurationhas one additional Boolean propertyisAdminImpersonationPossiblewhich defines whether admin users can be impersonated by users with theImpersonatepermission. The property is set tofalseby default forBasicAuthenticationConfiguration,OAuth2ConfigurationandDummyAuthenticationConfiguration.
- #6087 #6155
DeploymentManagerAPI changes:DMRunDeploymentCommand.savepointPathwas replaced byupdateStrategy: DeploymentUpdateStrategy- In places where
savepointPath = Nonewas passed, theDeploymentUpdateStrategy.ReplaceDeploymentWithSameScenarioName(StateRestoringStrategy.RestoreStateFromReplacedJobSavepoint)should be passed - In places where
savepointPath = Some(path)was passed, theDeploymentUpdateStrategy.ReplaceDeploymentWithSameScenarioName(StateRestoringStrategy.RestoreStateFromCustomSavepoint(path))should be passed
- In places where
DMValidateScenarioCommand.updateStrategywas added- In every place should the
DeploymentUpdateStrategy.ReplaceDeploymentWithSameScenarioName(StateRestoringStrategy.RestoreStateFromReplacedJobSavepoint)should be passed
- In every place should the
deploymentSynchronisationSupportfield was added for purpose of synchronisation of statuses. If synchronisation mechanism is not used in context of given DM, you should returnNoDeploymentSynchronisationSupportobject. The synchronisation mechanism is used by/api/deployments/{deploymentId}/statusendpoint. Other endpoints don't use it.
- #6249
TopicNametrait was introduced and is used in context of specialized topic name (for kafka sources and sinks). Moreover,UnspecializedTopicNamecase class was added and is used in places when the specialization is unknown/not needed.
Configuration changes
- #6082 Default Influx database was changed from
esptonussknacker_metrics
Other changes
In version 1.15.0
Code API changes
- #5609 #5795 #5837 #5798 Refactoring around DeploymentManager's actions:
- Custom Actions
CustomAction,CustomActionParameterandCustomActionResultmoved fromextension-apitodeployment-manager-apimoduleCustomActionResult.reqwas removedCustomActionwas renamed toCustomActionDefinitionCustomActionRequest(from theextension-api) was renamed toCustomActionCommandCustomActionRequesthas additional comment parameter (like deploy and cancel actions)
- Other "action" methods - all methods operating on a scenario (or its deployment) were replaced by case classes and
one method handling them all:
processCommand(command):validate-DMValidateScenarioCommanddeploy-DMRunDeploymentCommandcancelwithdeploymentIdargument -DMCancelDeploymentCommandcancelwithoutdeploymentIdargument -DMCancelScenarioCommandstopwithdeploymentIdargument -DMStopDeploymentCommandstopwithoutdeploymentIdargument -DMStopScenarioCommandsavepoint-DMMakeScenarioSavepointCommandtest-DMTestScenarioCommand
- "Action type" was renamed to "action name". Loosened the restriction on the name of the action:
ProcessActionType(enum with fixed values) is replaced withScenarioActionName,- in
ProcessActionattributeactionTyperenamed toactionName - in table
process_actionscolumnaction_typeis renamed toaction_name
DeploymentManagerDependencies.deploymentServicewas splitted intodeployedScenariosProviderandactionService- Events renamed:
OnDeployActionSuccessrenamed toOnActionSuccessOnDeployActionFailedrenamed toOnActionFailed
- Custom Actions
- #5762 for the Flink-based TestRunner scenario builder you should replace the last component that was
testResultServicewithtestResultSink - #5783 Return type of
allowedProcessingModemethod inComponenttrait has been changed toAllowedProcessingModestype which is one of:AllowedProcessingModes.Allin case of all processing modes allowedAllowedProcessingModes.SetOf(nonEmptySetOfAllowedProcessingModes)in case only set of processing modes is allowed
- #5757 Refactored API around
FlinkSource- Added
StandardFlinkSourcewith more granular additional traits replacing the need forFlinkIntermediateRawSource - Removed
BasicFlinkSourceandFlinkIntermediateRawSource. Sources extending these traits should now extendStandardFlinkSource. For reference on how to migrate, see changes inFlinkKafkaSourceorCollectionSource - Renamed
FlinkSource'ssourceStreammethod tocontextStream - Removed
EmptySourceFunction
- Added
- #5757 Added support for bounded sources and Flink runtime mode in
Flink tests
CollectionSourcenow takes Flink'sBoundednesswith defaultUnboundedandRuntimeExecutionModewith defaultNoneas a parameters. It's encouraged to set theBoundednessto bounded if applicableBoundednessandRuntimeExecutionModeis also possible to set inFlinkTestScenarioRunnerin new overloadingrunWithDatamethod
Configuration changes
- #5744 Extracted unbounded stream specific components into separate
module:
- Components
periodic,union-memo,previousValue, aggregates, joins anddelayfrombasewere moved intobase-unboundedmodule. They are now built asflinkBaseUnbounded.jarunderwork/components/flink/flinkBaseUnbounded.jar. - Configuration of tumbling windows aggregate offset is changed at the ComponentProvider level:
components.base.aggregateWindowsConfig.tumblingWindowsOffsetshould now be set ascomponents.baseUnbounded.aggregateWindowsConfig.tumblingWindowsOffset - If you previously specified base component jar explicitly in
modelConfig.classPathascomponents/flink/flinkBase.jarand want to retain the unbounded specific components you need to addcomponents/flink/flinkBaseUnbounded.jarexplicitly. - #5887 When using a custom DesignerConfig, ensure that long text elements like 'generate file' are positioned in the last row to prevent excessive spacing between elements.
- Components
Other changes
- #5574 Removed the support for the pluggable expression languages:
ExpressionConfig.languagesremoved - #5724 Improvements: Run Designer locally
- Introduce
JAVA_DEBUG_PORTto run the Designer locally with remote debugging capability - Removed
SCALA_VERSION, please useNUSSKNACKER_SCALA_VERSIONinstead of it
- Introduce
- #5824 Decision Table parameters rename:
- "Basic Decision Table" -> "Decision Table"
- "Expression" -> "Match condition"
- #5881
nussknacker-interpretermodule was renamed tonussknacker-scenario-compiler - #5875 Added configurable idle timeout to Flink Kafka source with the
default value of 3 minutes. You can configure this timeout in Kafka component config at
idleTimeout.durationor disable it atidleTimeout.enabled. You can learn about idleness in Flink general docs and Kafka connector-specific docs - #5875 Removed
useNamingStrategyForConsumerGroupIdfeature flag allowing for disabling namespaced Kafka consumer groups - #5848: Introduced a new method for handling colors, aimed at simplifying customization. Now, all colors are centrally stored in a single location. Refer to README.md for details on theme colors customization.
- #5914 Removed dev-specific configuration files
dev-application.confanddev-tables-definition.sqlfrom public distribution artifacts
In version 1.14.0
Code API changes
- #5271 Changed
AdditionalUIConfigProvider.getAllForProcessingTypeAPI to be more in line with FragmentParameterSingleComponentConfigWithoutIdrenamed toComponentAdditionalConfig- field
params: Map[String, ParameterConfig]changed toparameterConfigs: Map[String, ParameterAdditionalUIConfig] ParameterAdditionalUIConfigis handled analogously toFragmentParameter(expect forvalueCompileTimeValidation, which isn't yet handled)ParameterConfig.defaultValue->ParameterAdditionalUIConfig.initialValueParameterConfig.hintText->ParameterAdditionalUIConfig.hintText- most of the capabilities of
ParameterConfig.editorandParameterConfig.validatorsare covered byParameterAdditionalUIConfig.valueEditorandParameterAdditionalUIConfig.valueCompileTimeValidation
- #5285 Changes around scenario id/name fields:
CanonicalProcess.idof typeStringwas replaced bynamefield of typeProcessNameCanonicalProcess.withProcessIdwas renamed towithProcessNameScenarioWithDetails.idwas removed (it had the same value asname)ScenarioWithDetails.processIdchanged the type toOption[ProcessId]and will have alwaysNonevalueComponentUsagesInScenario.idwas removed (it had the same value asname)ComponentUsagesInScenario.processIdwas removedListenerScenarioWithDetails.idwas removed (it had the same value asname)ValidatedDisplayableProcess.idof typeStringwas replaced bynamefield of typeProcessNameDisplayableProcess.idof typeStringwas replaced bynamefield of typeProcessName,processNamefield is removed- deprecated
AsyncExecutionContextPreparer.prepareExecutionContextwas removed AsyncExecutionContextPreparer.preparenow takesProcessNameinstead ofString
- #5288 #5474 RemoteEnvironment / ModelMigration changes:
ProcessMigration.failOnNewValidationErrorwas removed - it wasn't used anywhere anymoreRemoteEnvironment.testMigrationresult types changesshouldFailOnNewErrorsfield was removed - it wasn't used anywhere anymoreconvertedfield was replaced by theprocessNamefield which was the only information that was used
RemoteEnvironment.migratetakesScenarioParametersinstead ofcategory
- #5361
Parameterhas new, optionallabelOptfield which allows to specify label presented to the user without changing identifier used in scenario graph json (Parameteter.name) - #5356 Changes in AdditionalUIConfigProvider.getAllForProcessingType now require model reload to take effect.
- #5393 #5444
- Changes around metadata removal from the REST API requests and responses:
DisplayableProcesswas renamed toScenarioGraphScenarioGraphfields that were removed:name,processingType,category- all these fields already were inScenarioWithDetailsProcessPropertiesfield removed:isFragment- this field already was inScenarioWithDetailsScenarioWithDetailsfieldjson.validationResultwas moved into the top level ofScenarioWithDetailsScenarioWithDetailsfieldjsonwas renamed intoscenarioGraphand changed the type intoScenarioGraphValidatedDisplayableProcesswas renamed toScenarioGraphWithValidationResultScenarioGraphWithValidationResultall scenario graph fields were replaced by onescenarioGraph: DisplayableProcessfield
- Migration mechanisms (
RemoteEnvironmentandTestModelMigrations) useScenarioWithDetailsForMigrationsinstead ofScenarioWithDetails
- Changes around metadata removal from the REST API requests and responses:
- #5424 Naming cleanup around
ComponentId/ComponentInfoComponentInfowas renamed toComponentIdComponentIdwas renamed toDesignerWideComponentId- new
ComponentIdis serialized in json to string in format$componentType-$componentNameinstead of separate fields (nameandtype) NodeComponentInfo.componentInfowas renamed tocomponentId
- #5438 Removed sealed trait
CustomActionError, nowCustomActionResultis always used - #5465 #5457 Typed related changes
CommonSupertypeFindershouldn't be created directly anymore -CommonSupertypeFinder.*predefined variables should be used instead, in most cases just (CommonSupertypeFinder.Default)TypedObjectTypingResult.applyremoved legacy factory method takingList[(String, TypingResult)]- should be used variant withMapTypedObjectTypingResult.applyremoved legacy factory method takingTypedObjectDefinition- should be used variant withMapTypedObjectTypingResult.applyis deprecated - should be usedTyped.record(...)instead. It will be removed in further releasesTypedObjectDefinitionwas removedTyped.emptywas removed,TypedUnionnow handles only >= 2 typesTyped.apply(vararg...)was replaced byTyped.apply(NonEmptyList)andTyped.apply(firstType, secondType, restOfTypesVaraarg...)If you have a list of types and you are not sure how to translate it toTypingResultyou can try to useTyped.fromIterableOrUnknownIfEmptybut it is not recommended - see docs next to it.TypedUnionis not a case class anymore, but is still serializable - If it was used in a Flink state, state will be probably not compatible
- #5517 Legacy
OnFinishedlistener-api event was removed - #5474
Componentclass now need to specifyallowedProcessingModes. Most of the implementations (CustomStreamTransformer,Service,SinkFactory) has default wildcard (None). ForSourceFactoryyou need to specify whichProcessingModethis source support. You have predefined traits:UnboundedStreamComponent,BoundedStreamComponent,RequestResponseComponent,AllProcessingModesComponentthat can be mixed into the component - #5474 Changes around new scenario metadata (aka "parameters"):
ScenarioWithDetails: addedprocessingModeandengineSetupNamefields
- #5522, #5521, #5519
DeploymentManagerAPI related changes:- In the
DeploymentManager:DeploymentManager.getProcessState(ProcessIdWithName, Option[ProcessAction])become final. You should implementresolvemethod instead. It does the same, onlyList[StatusDetails]are already determined.- Method
DeploymentManager.getProcessStatessignature was changed and now requires an implicitfreshnessPolicy: DataFreshnessPolicy - Trait
AlwaysFreshProcessStateand methodgetFreshProcessStateswere removed, instead of it please usegetProcessStateswithDataFreshnessPolicy.Freshpolicy - Managers
FlinkStreamingRestManagerandFlinkRestManagerrequire new parameter:scenarioStateCacheTTL: Option[FiniteDuration]
- In the
DeploymentManagerProvider:- New methods were added:
defaultEngineSetupNameandengineSetupIdentity. They have default implementations, you should consider to replace them by your own - New, overloaded
createDeploymentManagerwas added. In the new one most of the parameters were bundled intoDeploymentManagerDependenciesclass which allows to easier pass these dependencies to delegates. Also, this method returnsValidateNel[String, DeploymentManager]. You can return errors that will be visible to users e.g. invalid configuration etc. The old one is deleted. - Method
createDeploymentManagersignature was changed and now requires new parameter:scenarioStateCacheTTL: Option[FiniteDuration]
- New methods were added:
- In the
- #5526 Refactored namespaces:
- Removed
ObjectNamingSPI - Removed logging when using naming strategy
- Replaced
ObjectNamingwith singleNamingStrategywhich prepares a name with a prefix fromnamespacekey fromModelConfigor returns the original name if the value is not configured
- Removed
- #5535
ProcessingTypeConfig.classpathcontains now raw,Stringentries instead ofURL. TheStringtoURLconverting logic is now insideModelClassLoader.apply
- #5505 anonymous access functionality for Tapir-based API
AuthenticationResources&AnonymousAccesstraits were changed to be able to introduce anonymous access featureAuthCredentialsclass was changed too
- #5373#5694 changes related to
Components andLazyParameters:LazyParametercan be evaluated on request thanks to itsevaluatemethodParamsdata class was introduced as a replacement for runtime parameters values defined asMap[String, Any].Paramsdata class, in its extraction methods, assumes that a parameter with the given name exists in the underlying Map.TypedExpressionwas removed fromBaseDefinedParameterhierarchy in favour ofTypingResultTypedExpressiondoesn't depend onExpressionTypingInfoanymoreServiceInvokerrefactoring (parameters map was removed, a context is passed to its method)ProcessListenerinterface changed slightlyParameterWithExtractorutil was replaced withParameterDeclaration.- classes renaming:
LazyParameterInterpretertoLazyParameterInterpreterGenericNodeTransformationtoDynamicComponentSingleInputGenericNodeTransformationtoSingleInputDynamicComponentJoinGenericNodeTransformationtoJoinDynamicComponentJavaGenericTransformationtoJavaDynamicComponentJavaGenericSingleTransformationtoJavaSingleInputDynamicComponentJavaGenericJoinTransformationtoJavaJoinDynamicComponentJavaSourceFactoryGenericTransformationtoJavaSourceFactoryDynamicComponentGenericContextTransformationWrappertoDynamicComponentWrapperSingleGenericContextTransformationWrappertoSingleInputDynamicComponentWrapperSourceFactoryGenericContextTransformationWrappertoSourceFactoryDynamicComponentWrapperJoinGenericContextTransformationWrappertoJoinDynamicComponentWrapper
- type
NodeTransformationDefinition(insideDynamicComponent) renamed toContextTransformationDefinition
- #5641
PeriodicProcessDeployment/DeploymentWithJarData/PeriodicProcessnow takes type parameterCanonicalProcessorUnitto point out whether it contains scenario json. - #5656
pl.touk.nussknacker.engine.api.expression.Expression#languagemethod returnsLanguagetrait instead ofString - #5707
ParameterNamedata class was introduced. It replacesStringin whole places where it's used as a parameter name - #5754 Fix for broken encoding mechanism in tests from file with Avro format, revert [0d9b600][https://github.com/TouK/nussknacker/commit/0d9b600]
- Classes
ResultsCollectingListener,TestResults,ExpressionInvocationResult,ExternalInvocationResultdepend onT - Classes
TestResults.nodeResultsusesResultContextinstead ofContext - Classes
TestResults.exceptionsusesExceptionResultinstead ofNuExceptionInfo - Added
variableEncodertoResultsCollectingListenerHolder.registerRun
- Classes
REST API changes
- #5280#5368 Changes in the definition API:
/api/processDefinitionData/componentIdsendpoint is removed/api/processDefinitionData/*response changes:services,sourceFactories,sinkFactories,customStreamTransformersandfragmentInputsmaps fields were replaced by onecomponentsmap with key in format$componentType-$componentNameand moved into top level of responsetypesInformationfield was renamed intoclasses, moved into top level of response and nestedclazzNameinside each element was extractedcomponentsConfigfield was removed - now all information about components are available in thecomponentsfieldnodeIdfield insideedgesForNodeswas renamed intocomponentIdin the flat$componentType-$componentNameformatdefaultAsyncInterpretationfield was removed
- #5285 Changes around scenario id/name fields:
/api/process(Details)/**endpoints:idfields was removed (it had the same value asname)processIdfields return alwaysnull.json.idfields was renamed to.json.name
/api/components/*/usagesendpoint:idfields was removed (it had the same value asname)processIdfields was removed
/api/processes/**/activity/attachments-processIdfields was removed/api/processes/**/activity/comments-processIdfields was removed- GET
processes/$name/$version/activity/attachments-$versionsegment is removed now
- #5393 Changes around metadata removal from the REST API requests and responses:
/api/processValidationwas changed to/api/processValidation/$scenarioNameand changed request type/api/testInfo/*was changed to/api/testInfo/$scenarioName/*and changed request format regarding code API changes/api/processManagement/generateAndTest/$sampleswas changed to/api/processManagement/generateAndTest/$scenarioName/$samples/api/processesExport/*was changed to/api/processesExport/$scenarioName/*and changed response format regarding code API changes/api/processes/import/$scenarioNamewas changed response into{"scenarioGraph": {...}, "validationResult": {...}- GET
/api/processes/*and/api/processesDetails/*changed response format regarding code API changes - PUT
/api/processes/$scenarioNamewas changed request field fromprocesstoscenarioGraph /api/adminProcessManagement/testWithParameters/$scenarioNamewas changed request field fromdisplayableProcesstoscenarioGraph
- #5424 Naming cleanup around
ComponentId/ComponentInfo- Endpoints returning test results (
/api/processManagement/test*) returnnodeIdinstead ofnodeComponentInfonow /processDefinitionData/*response: fieldtypewas replaced bycomponentIdinside the path.componentGroups[].components[]
- Endpoints returning test results (
- #5462
/api/processes/category/*endpoint was removed - #5474 POST
/api/processes/$scenarioName/$category?isFragment=$isFragmentresource become deprecated. It will be replaced by POST/processeswith fields:name,isFragment,forwardedUserName,category,processingMode,engineSetupName. Three last fields are optional. Please switch to the new API because in version 1.5, old API will be removed. - POST
/api/nodes/$scenarioName/validationresponse for object invalidationErrorsarray can havedetailsof the error
Configuration changes
- #5297
componentsUiConfigkey handling change:$processingType-$componentType-$componentNameformat was replaced by$componentType-$componentNameformat
- #5323 Support for the legacy categories configuration format was removed.
In the new format, you should specify
categoryfield inside each scenario type. - #5419 Support for system properties was removed from model configuration (they aren't resolved and added to merged configuration)
- #5474 You have to ensure that in every scenarioType model's
classPath, in every jar are only components with not colliding processing modes. Also at least one component has defined processing mode other than wildcard. On the other hand starting from this version, you can use the same category for many scenarioTypes. You only have to ensure that they have components with other processing modes or other deployment configuration. - #5558 The
processToolbarConfigtoolbar withtype: "process-info-panel"no longer accepts thebuttonsproperty. It only display scenario information now. However, a new toolbar withtype: "process-actions-panel"has been introduced, which does accept thebuttonsproperty and renders actions similar to the oldtype: "process-info-panel".
Helm chart changes
- #5515 #5474 Helm chart now has two preconfigured scenario types (
streamingandrequest-response) instead of one (default). Because of that, scenario created using previous version of helm chart will have invalid configuration in the database. To fix that, you have to manually connect to the database and execute sql statement:UPDATE processes SET processing_type = 'given-scenario-type' where processing_type = 'default';
Other changes
- #4287 Cats Effect 3 bump Be careful with IO monad mode, we provide an experimental way to create IORuntime for the cat's engine.
- #5432 Kafka client, Confluent Schema Registry Client and Avro bump
- #5447 JDK downgraded from 17 to 11 in lite runner image for scala 2.13
- #5465 Removed
strictTypeCheckingoption andSupertypeClassResolutionStrategy.Unionused behind it - #5517 Removed legacy mechanism marking scenario finished based on the fact that the last action was deploy and job was finished. The new mechanism leverage deployment id which was introduced in #4462 in 1.11 version.
- #5474 The mechanism allowing migration between two environments uses by default the new,
scenario creating API. In case when the secondary environment is in the version < 1.14, you should switch
secondaryEnvironment.useLegacyCreateScenarioApiflag to on. - #5526 Added namespacing of Kafka consumer group id in both engines.
If you have namespaces configured, the consumer group id will be prefixed with
namespacekey from model config - in that case a consumer group migration may be necessary for example to retain consumer offsets. For gradual migration, this behaviour can be disabled by settinguseNamingStrategyInConsumerGroups = falseinKafkaConfig. Note that theuseNamingStrategyInConsumerGroupsflag is intended to be removed in the future.
In version 1.13.1 (Not released yet)
Code API changes
- #5447 JDK downgraded from 17 to 11 in lite runner image for scala 2.13
In version 1.13.0
Code API changes
- #4988 Method definition
def authenticationMethod(): Auth[AuthCredentials, _]was changed todef authenticationMethod(): EndpointInput[AuthCredentials] - #4860 DeploymentManagerProvider implementations have to implement the method
def scenarioPropertiesConfig(config: Config): Map[String, ScenarioPropertyConfig]instead ofdef additionalPropertiesConfig(config: Config): Map[String, AdditionalPropertyConfig] - #4919 Improvement: Support for handling runtime exceptions at FlinkTestScenarioRunner:
TestProcess.exceptionstype changed fromList[ExceptionResult[T]]toList[NuExceptionInfo[_ <: Throwable]]
- #4912 Changes in scenario details:
pl.touk.nussknacker.restmodel.processdetails.BaseProcessDetails[_]andpl.touk.nussknacker.restmodel.processdetails.BasicProcessused in rest resources were merged intopl.touk.nussknacker.restmodel.scenariodetails.ScenarioWithDetailspl.touk.nussknacker.restmodel.processdetails.BaseProcessDetails[_]used inpl.touk.nussknacker.ui.listener.services.PullProcessRepositorywere moved intolistener-apiand renamed intopl.touk.nussknacker.ui.listener.ListenerScenarioWithDetailspl.touk.nussknacker.restmodel.processdetails.ProcessDetailsandpl.touk.nussknacker.restmodel.processdetails.ValidatedProcessDetailstype aliases are not available anymore - you should probably useScenarioWithDetailsin these placespl.touk.nussknacker.restmodel.processdetails.ProcessVersionwas moved intopl.touk.nussknacker.engine.api.process.ScenarioVersionpl.touk.nussknacker.restmodel.processdetails.StateActionsTypeswas moved intoProcessActionType.StateActionsTypes
- #4959
listener-apimodule become decoupled fromrestmodelmodule. Some classes were moved toextensions-apimodule to make it possible:pl.touk.nussknacker.restmodel.displayedgraphpackage was renamed topl.touk.nussknacker.engine.api.displayedgraphpl.touk.nussknacker.restmodel.displayedgraph.ValidatedDisplayableProcesswas moved topl.touk.nussknacker.restmodel.validationpackagepl.touk.nussknacker.restmodel.process.ProcessingTypewas moved topl.touk.nussknacker.engine.api.processpackagepl.touk.nussknacker.restmodel.scenariodetails.ScenarioVersionwas moved topl.touk.nussknacker.engine.api.processpackage
- #4745 Added method
ScenarioBuilderto create fragments with specified input node id instead of taking a default from fragment id - #4745 Add more errors for scenario and node id validation and change names, messages of existing ones
- #4928 #5028
Validator.isValidmethod now takesexpression: Expression, value: Option[Any]instead ofvalue: Stringwhich was not really value, but expression. Straight-forward migration is to change method definition and now useexpression.expressioninstead ofvalueif your validator depends on raw expression. If validator was doing quasi-evaluation, for example trimming'to get string, you can just takevalueand cast it to desired class.LiteralNumberValidatoris removed, to achieve same result useCompileTimeEvaluableValueValidatorwith parameter ofNumbertype,LiteralIntegerValidatoris considered deprecated and will be removed in the future, to achieve same result useCompileTimeEvaluableValueValidatorwith parameter ofIntegertype,LiteralRegExpParameterValidatoris renamed toRegExpParameterValidator- annotation
pl.touk.nussknacker.engine.api.validation.Literalwas renamed topl.touk.nussknacker.engine.api.validation.CompileTimeEvaluableValue
- #5079
AuthCredentialsis moved topl.touk.nussknacker.securityinextensions-api - #5103
- Values of
ExpressionConfig.globalImportsandExpressionConfig.dictionariesaren't wrapped withWithCategoriesanymore WithCategories.applywithcategoriesvarrag variant is replaced by version with headcategoryand tailcategoriesvarrag Previous version was commonly wrongly used as an "object without categories specified" but in fact it was "object with empty categories list" which means that object should be never visible. To create "object without categories specified" use,WithCategories.anyCategory. If you want to pass just a list of categories, useWithCategories(value, Some(list), SingleComponentConfig.zero)
- Values of
- #5171 Changes around
ComponentTypevalues changes:- In
ComponentTypevalues:- Built-in component's artificial component types (
Filter,Split,Switch,Variable,MapVariable) were replaced byBuiltIntype ProcessorandEnrichercomponent types were replaced byServiceFragmentswas replaced byFragmentCustomNodewas replaced byCustomComponent
- Built-in component's artificial component types (
- In
ComponentInfo: Order of parameters swapped + names of them changedcomponentType->type,componentName->name
- In
- #5209 Now
TestScenarioRunnerdoesn't load components fromComponentProviderautomatically. Instead, it loads some predefined set of components. Rest of them you need to pass components usingwithExtraComponentsmethod. Components loaded automatically:TestScenarioRunner.liteBased- frombaseproviderTestScenarioRunner.kafkaLiteBased- frombaseandkafkaprovidersTestScenarioRunner.requestResponseBased- frombaseandrequestResponseprovidersTestScenarioRunner.flinkBased- frombaseproviderTestScenarioRunnernow also uses global variables from default model
- #4956 Refactor: Cleanup TestResults
- Changed signature
DeploymentManager.testmethod, and removedvariableEncoderparam - Classes
TestResults,ExpressionInvocationResult,ExternalInvocationResultdon't depend onT - Classes
NodeResultis removed. Instead,Contextis used directly - Removed
variableEncoderfromResultsCollectingListenerHolder.registerRun - Removed
ResultContext, please useContextinstead of it
- Changed signature
- #5240 Simpler result types in
TestScenarioRunnerRunResultandRunUnitResulthas no generic parameter anymoreRunResultand its descendants has nosuccessmethod anymore - forRunListResultshould be usedsuccessesinstead
REST API changes
- #4745 Change
api/properties/*/validationendpoint request type- Replace
processPropertieswithadditionalFields - Add
idfield for scenario or fragment id
- Replace
- #5039#5052 Changes in endpoints
api/parameters/*/suggestionsrequestvariablesis renamed tovariableTypesand it should have only local variables now
api/processes/**response.json.validationResult.nodeResults.variableTypesdoesn't contain global variables types anymore
api/processDefinitionData/*response.processDefinition.globalVariablesis removed
api/parameters/*/validaterequestscenarioNameis removedprocessPropertiesis removed
Configuration changes
- #4860 In file-based configuration, the field
scenarioTypes.<scenarioType>.additionalPropertiesConfigis renamed toscenarioTypes.<scenarioType>.scenarioPropertiesConfig - #5077 In SQL enricher configuration,
connectionPropertieswas changed todataSourceProperties
Other changes
- #4901 Improvements TestScenarioRunner:
- Changes at
FlinkProcessRegistrar.registerpassingresultCollectorinstead oftestRunId
- Changes at
- #5033 Scala 2.13 was updated to 2.13.12, you may update your
flink-scala-2.13to 1.1.1 (it's not required, new version is binary-compatible) - #5059 #5100 Categories configuration doesn't allow configuring multiple categories for the same scenario type. If you have such a case, you have to extract another scenario types and assign each category to each scenario type. Because of this change configuration of categories was also removed from Components configuration
- #4953 Stricter validation in base components:
- Boolean expressions in
SwitchandFilternodes are required not null values - Variable values in
MapVariable,FragmentOutputandVariableare mandatory - Field names in
MapVariable,FragmentOutputare required to be unique
- Boolean expressions in
- #4698 Due to change in program argument encoding all scheduled batch scenarios handled by periodic DM must be cancelled before upgrade
In version 1.12.6
Other changes
- #5447 JDK downgraded from 17 to 11 in lite runner image for scala 2.13
In version 1.12.x
Code API changes
- #4574 Improvements: at
KafkaClientandRichKafkaConsumerin kafka-test-utilsRichKafkaConsumer.consumeWithJsonneeds json decoder- removed
RichKafkaConsumer.consumeWithConsumerRecord, useRichKafkaConsumer.consumeWithJsoninstead of it RichKafkaConsumer.defaultSecondsToWaitrenamed toRichKafkaConsumer.DefaultSecondsToWaitKafkaClient.sendMessageaccepts generic content with json encoder
- #4583
DeploymentManagerhas new variants of methodcancelandstoptakingDeployomentIdnext toProcessName. They will be used with batch processing mechanism (periodic DM) so it is necessary to implement it only if your DM will be wrapped byPeriodicDeploymentManager - #4685 In
AuthenticationResourcestrait it was added two new methods that have to be implemented in the child classes:def authenticationMethod(): Auth[AuthCredentials, _]anddef authenticate(authCredentials: AuthCredentials): Future[Option[AuthenticatedUser]]. The first one tells what authentication method will be used (it's for Tapir-based API purposes) and the latter one is the authentication action itself. Thedef authenticate(): Directive1[AuthenticatedUser]should be treated as deprecated. It's used in the NU APIs which are still Akka HTTP-based. When we get rid of Akka HTTP, it will be removed. - #4762 Rename
RegExpParameterValidatortoLiteralRegExpParameterValidator
REST API changes
- #4697 Change
api/parameters/*/validateandapi/parameters/*/suggestionsendpoints.- Use
processingTypeinstead ofprocessName - Add
scenarioNameparameter toParametersValidationRequestused inapi/parameters/*/validate
- Use
- #4602 Cleaning subprocess usages after NU 1.11 release
- Removed isSubprocess endpoint param, use isFragment from now on.
- Removed backward compatibility for subprocess fields.
Other changes
- #4492 Allow testing fragments using ad-hoc testing method.
By default, NU enables that feature but if you have some custom
processToolbarConfigsettings then You would like to removehidden: { fragment: true }flag fortype: "test-with-form",type: "test-counts"andtype: "test-hide"insideprocessToolbarConfig -> "test-panel".
In version 1.11.0
Code API changes
- #4295
DeploymentManager.getProcessState(ProcessName)method now returnsList[StatusDetails]instead ofOption[StatusDetails]. If you are a consumer of this API and want to have the same behavior as previously, you can useInconsistentStateDetector.extractAtMostOneStatusmethod for that. Notice, that in the future visibility of this method may be changed into private. - #4462
StatusDetails.deploymentIdfield changed type intoOption[DeploymentId]. It contains, internal designer's deployment id. It is used to assign deployment on runtime side with deployment action on designer side in periodic DM for purpose of correct status synchronization. If you want to make it filled, you should pass the correct value inDeploymentData.deploymentId. Current value ofdeploymentId: Option[ExternalDeploymentId]was moved intoexternalDeploymentIdfield.ProcessActionhas a new field -id.ProcessStateDefinitionManager.processStatevariant of methods with multiple parameters was removed - you should useProcessStateDefinitionManager.processState(StatusDetails)variant instead. - #4353 Removed isCancelled/isDeployed flags based on
ProcessAction,ProcessAction.actionrenamed to actionType. TraitProcessis removed. - #4484
ProcessIdWithNamemoved from packagepl.touk.nussknacker.restmodel.processtopl.touk.nussknacker.engine.api.processDeploymentManager.getProcessState(ProcessName, Option[ProcessAction])method now takesProcessIdWithNameas an argument instead ofProcessName. The same withPostprocessingProcessStatus.postprocess.
REST API changes
- #4454 Rename 'subprocess' to 'fragment' along with all endpoints (with backward compatibility).
isSubprocessquery parameter is renamed toisFragment.isSubprocesswill be removed in 1.12.0
- #4462 Process state API returns
externalDeploymentIdinstead ofdeploymentId.
Other changes
- #4514
AkkaHttpBackendin designer is replaced byAsyncHttpClientFutureBackend. To use custom http client configuration useahc.propertiesfile and make sure it is available in the classpath.
In version 1.10.0
Code API changes
- #4352
TypedObjectTypingResult#fieldsare no longer ordered, fields will be sorted for presentation (seeTypedObjectTypingResult#display) - #4294
HttpRemoteEnvironmentConfigallows you to pass flagpassUsernameInMigration- (default true). When set to true, migration attaches username in the form ofRemote[userName]while migrating to secondary environment. To use the old migration endpoint, set to false. - #4278 Now expression compiler and code suggestions mechanism are reusing the same
types extracted based on model. Before the change types in compiler were lazily extracted. Because of this change, some expressions
can stop to compile. You may need to add
WithExplicitTypesToExtractto some of yoursSourceFactoryimplementations. See extending classes for examples on how to implement it. - #4290 Renamed predicates used in
ClassExtractionSettings:ClassMemberPatternPredicaterenamed toMemberNamePatternPredicateAllMethodNamesPredicaterenamed to AllMembersPredicate
- #4299, #4300
StateStatusis identified by its name.ProcessStateserialization uses this name as serialized state value.
Sealed traitStateStatusis unsealed, all members are replaced by correspondingSimpleStateStatusstate definitions, custom statuses are defined within eachProcessStateDefinitionManager.ProcessActionis moved from restmodel to extensions-api, package engine.api.deployment. - #4339 Improvements: Don't fetch state for archived/unarchived scenario, return computed based on last state action At BaseProcessDetails we provide lastStateAction field which can have an influence on the presented state of the scenario. We currently use it to distinguish between cancel / not_deployed and to detect inconsistent states between the designer and engine
- #4302 State inconsistency detection was moved from designer to DeploymentManager.
DeploymentManager.getProcessStatefor internal purposes returnsOption[StatusDetails]which is based on job status from deployment manager (instead ofOption[ProcessState]which contains UI info). There is separategetProcessStatethat returnsProcessStatewhich is a status from engine resolved viaInconsistentStateDetectorand formatted with UI-related details.PeriodicProcessEventusesStatusDetailsinstead ofProcessState. Constants defined inProblemStateStatusare renamed to match UpperCamelCase formatting. - #4350
StateStatus.isDuringDeploy,StateStatus.isFinished,StateStatus.isFailed,StateStatus.isRunning,ProcessState.isDeployedmethods were removed. Instead, you should compare status with specific status. - #4357 Changed structure of
MetaDatainCanonicalProcess-TypeSpecificDataautomatically migrated toProcessAdditionalFields- Example MetaData structure before migration:
{
"id": "scenarioName",
"typeSpecificData": {
"parallelism": 1,
"spillStateToDisk": true,
"checkpointIntervalInSeconds": null,
"type": "StreamMetaData"
},
"additionalFields": {
"description": null,
"properties": {
"someCustomProperty": "someCustomValue"
}
}
}- Example MetaData structure after migration:
{
"id": "scenarioName",
"additionalFields": {
"description": null,
"properties": {
"parallelism" : "1",
"spillStateToDisk" : "true",
"useAsyncInterpretation" : "",
"checkpointIntervalInSeconds" : "",
"someCustomProperty": "someCustomValue"
},
"metaDataType": "StreamMetaData"
}
}
Configuration changes
- #4283 For OIDC provider,
accessTokenIsJwtconfig property is introduced, with default valuesfalse. Please mind, that previous Nussknacker versions assumed its value is true ifauthentication.audiencewas defined. - #4357
TypeSpecificDataproperties are now be configured inDeploymentManagerProvider:- Main configuration is done through
additionalPropertiesConfiglike other additional properties - Initial values overriding defaults from the main configuration can be set in
metaDataInitializer
- Main configuration is done through
Other changes
- #4305
scala-compilerandscala-reflectare now included inflink-scala, so you can simplify your deployment by removing them and updating to new (flink-scalaJAR) (this doesn't introduce any functional changes)
REST API changes
- #4350
deleteaction is available only for archived scenarios. Before the change it was checked that scenario is not running
In version 1.9.0
Code API changes
- #4030 Changes for purpose of local testing of designer with other urls than on engine side
ProcessingTypeConfig.modelConfignow containsConfigWithUnresolvedVersioninstead ofConfig. OldConfigvalue is inConfigWithUnresolvedVersion.resolvedModelConfigLoader.resolveInputConfigDuringExecutiontakesConfigWithUnresolvedVersioninstead ofConfig. UseConfigWithUnresolvedVersion.applyfor easy transition between those classes
- #3997 Removal of obsolete
subprocessVersions. It affectsMetaData,ProcessMetaDataBuilderandDisplayableProcessproperties. - #4122, #4132, #4179, #4189
- Use
ProcessStateDefinitionManager.stateDefinitionsto describe states: 1) their default properties 2) how the states are presented in filter-by-status options.
(see an example of basic definitions inSimpleProcessStateDefinitionManagerandSimpleStateStatus). - State defaults and allowed actions are moved to
SimpleStateStatus,FlinkStateStatus,PeriodicStateStatus,EmbeddedStateStatusandK8sStateStatusfrom corresponding state-definition-managers (see exampleFlinkProcessStateDefinitionManager). - Type
CustomStateStatus.namerenamed toStatusName ProcessResourcesexposes new endpoint/api/procecesses/statusDefinitions- Within the base set of statuses used in Embedded, Flink, K8 and Periodic mode (
SimpleStateStatus), statusesFailing,Failed,Error,Warning,FailedToGetandMulipleJobsRunningare replaced by oneProblemStateStatuswhich is parametrized by specific message.ProblemStateStatusprovides several builder methods, one for each corresponding removed state. Those builders allow to preserve the exact moments when each state appears in the scenario lifecycle. - Displayed tooltip and description of
ProblemStateStatushave the same value. - Removed
SimpleStateStatus.Unknown - Removed status
FailedStateStatus. UseProblemStateStatusinstead. - Status configuration for icon, tooltip and description is obligatory.
- Use
- #4104
DeploymentManager.findJobStatuswas renamed togetProcessState. NewDataFreshnessPolicyparameter was added. Returned type was changed toWithDataFreshnessStatus[T]whereTis the previous value andcached: Booleanis additional information that should be provided. If you provideDeploymentManagerwhich communicate remotely with some service, and you want to use standard build-in caching forProcessState, wrap yourDeploymentManagerusingCachingProcessStateDeploymentManager.wrapWithCachingIfNeededin yourDeploymentManagerProvider. Thanks to that, caching will be handled as expected, and yourDeploymentManagerjust should extendAlwaysFreshProcessStatewhich provide the same interface as the previous one, with only method name changed. Especially, when you use 'PeriodicDeploymentManagerProvider',delegateshould already returnDeploymentManagerwrapped by caching mechanism. - #4131
Parameter.defaultValuenow holdsOption[Expression]instead ofOption[String]. You have to wrap aStringwithExpression.spel() - #4224 If you're using Flink with Nussknacker built with Scala 2.13, add this
jar in your Flink installation to
libdir. It's our implementation oforg.apache.flink.runtime.types.FlinkScalaKryoInstantiator(sources are here) which is needed to properly (de)serialize Flink state when using scala 2.13. Hopefully, it's temporary solution, until Flink becomes really scala-free and gets rid of thisFlinkScalaKryoInstantiatorclass or allows to have it in the job code (not Flink libs). - #4190 - introduced possibility to configure offset in
FlinkComponentsProvider(components.base.aggregateWindowsConfig.tumblingWindowsOffset, by default 0) for aggregates with tumbling windows. You might want to set it up, especially when you want your daily windows to be aligned according to your timezone if it's not UTC. See example in Flink docs
Other changes
- #4122, #4132 Changes in state definitions:
- In
ProcessStateDefinitionManagerdefault behaviour of methodsstatusTooltip,statusDescriptionandstatusIconis to return default properties defined viastateDefinitions. It is not necessary to override those methods when all definitions have fixed default properties. - To introduce custom status properties, extensions to basic definitions, use
OverridingProcessStateDefinitionManager. OverridingProcessStateDefinitionManagerallows to specify delegate (previously onlySimpleProcessStateDefinitionManagerwas available) and custom state definitions.- Parameter
delegateinOverridingProcessStateDefinitionManagerhas no default value, it should be provided explicitly. - There is additional validation when all processing types are reloaded from configuration: check if all processing types state definitions configuration is correct.
(see comment in
ProcessStateDefinitionService)
- In
- #3997 Due to removal of deprecated field
subprocessVersionsmigration of scenarios from and to remote environment, for Nussknacker version 1.9.0+ and older will not be possible. Use export and import as a workaround while working between older and newer version.
Other changes
- #3675 Improvements: Normalize kafka components params name
- Renamed kafka topic param name from
topictoTopic - Renamed kafka value param name from
valuetoValue
- Renamed kafka topic param name from
In version 1.8.0
Scenario authoring changes
- #3924
- Fixup:
{}is now interpreted as "allow everything schema", not as "object schema". Objects schemas have to have declared"type": "object". - Unknown is now allowed on sinks in both validation modes if output schema is "everything allowed schema".
- Fixup:
Code API changes
- #3924 - changes to
SwaggerTypedhierarchySwaggerMap(valuesType)->SwaggerObject(Map.empty, additionalProperties = AdditionalPropertiesEnabled(valuesType))AdditionalPropertiesSwaggerTyped->AdditionalPropertiesEnabledAdditionalPropertiesWithoutType->AdditionalPropertiesEnabled(SwaggerAny)SwaggerRecursiveSchema/SwaggerUnknownFallback->SwaggerAny
Other changes
-
#3835 Removed Signals and QueryableState. This change affects:
- Configuration
- Components and DeploymentManager API
- REST API
-
#3823, #3836, #3843 - scenarios with multiple sources can be tested from file
TestDataGenerator#generateTestDatareturns JSON test records instead of raw bytes. Test records are serialized to a file by designer Test record can optionally contain timestamp which is used to sort records generated by many sourcesTestDataParserwas replaced withTestRecordParserthat turns a single JSON test record into a source recordTestData.newLineSeparatedhelper was removed. Scenario test records have to be created explicitly. Each scenario test record has assigned sourceDeploymentManager#testtakesScenarioTestDatainstead ofTestData- Designer configuration
testDataSettings.testDataMaxBytesrenamed totestDataMaxLength
-
#3916 Designer configuration
environmentAlert.cssClassrenamed toenvironmentAlert.color -
#3922 Bumps: jwks: 0.19.0 -> 0.21.3, jackson: 2.11.3 -> 2.13.4
-
#3929 From now,
SchemaIdvalue class is used in every place where schema id was represented as an Int. For conversion betweenSchemaIdandIntuseSchemaId.fromIntandSchemaId.asInt. UseConfluentUtils.toSchemaWithMetadatainstead ofSchemaWithMetadata.applyfor conversion between Confluent'sSchemaMetadataand oursSchemaWithMetadata. -
#3948 Now, we are less dependent from Confluent schema registry. To make it possible, some kafka universal/avro components refactors were done. Most important changes in public API:
- ConfluentSchemaBasedSerdeProvider.universal was replaced by UniversalSchemaBasedSerdeProvider.create
Some other, internal changes:
- Non-confluent classes renamed and moved to desired packages
- Extracted new class: SchemaIdFromMessageExtractor to make Confluent logic explicit and moved to top level
- Extracted SchemaValidator to make Confluent logic explicit and be able to compose
- Some renames: ConsumerRecordUtils -> KafkaRecordUtils
- RecordDeserializer -> AvroRecordDeserializer (also inheritance replaced by composition)
- (De)SerializerFactory - easier abstractions
- ConfluentSchemaRegistryFactory is not necessary now - removed
In version 1.7.0
Scenario authoring changes
- #3701 Right now access in SpEL to not existing field on TypedMap won't throw exception, just will return
null - #3727 Improvements: Change RR Sink validation way:
- Added param
Value validation modeat RR response component - We no longer support
nullableparam from Everit schema. Nullable schema are supported by union with null e.g. `["null", "string"]
- Added param
Configuration changes
- #3768
request-response-embeddedandstreaming-lite-embeddedDeploymentManager types where replaced by onelite-embeddedDeploymentManager type with two modes:streamingandrequest-responselike it is done inlite-k8scase
Code API changes
- #3560, #3595
Remove dependency on
flink-scala. In particular:- Switched from using
scala.DataStreamtodatastream.DataStream. Some tools exclusive to scala datastreams are available inengine.flink.api.datastream - Scala based
TypeInformationderivation is no longer used, for remaining casesflink-scala-utilsmodule is provided (probably will be removed in the future)
- Switched from using
- #3680
SubprocessRef::outputVariableNamestype is changed fromOption[Map[String,String]]with default None, toMap[String,String]with defaultMap.empty - #3692 Rename
mockedResulttoexternalInvocationin test results collectors. - #3606 Removed nussknacker-request-response-app. As a replacement you can use:
- nussknacker-request-response-app in version <= 1.6
- Lite K8s engine with request-response processing mode
lite-embeddedDeployment Manager with request-response processing mode
- #3610 Removed deprecated code. For details see changes in pull request.
- #3607 Request-response jsonSchema based encoder:
- ValidationMode moved to package
pl.touk.nussknacker.engine.api.validationinnussknacker-components-api - BestEffortJsonSchemaEncoder moved to package
pl.touk.nussknacker.engine.json.encodeinnussknacker-json-utils
- ValidationMode moved to package
- #3738 Kafka client libraries upgraded to 3.2.3. If using older Flink version, make sure to use 2.8.x client libraries. For Flink versions 1.15.0-1.15.2 include also fixed KafkaMetricWrapper
- #3668 Method
runWithRequestsofRequestResponseTestScenarioRunner(returned byTestScenarioRunner.requestResponseBased()) now returnsValidatedNelwith scenario compilation errors instead of throwing exception in that case
REST API changes
- #3576
/processesendpoint without query parameters returns all scenarios - the previous behaviour was to return only unarchived ones. To fetch only unarchived scenariosisArchived=falsequery parameter has to be passed.
Other changes
- #3824 Due to data serialization fix, Flink scenarios using Kafka sources with schemas may be incompatible and may need to be restarted with clean state.
In version 1.6.0
- #3440 Feature: allow to define fragment's outputs
- Right now using fragments in scenario is changed. We have to provide each outputName for outputs defined in fragment.
Scenario authoring changes
- #3370 Feature: scenario node category verification on validation From now import scenario with nodes from other categories than scenario category will be not allowed.
- #3436 Division by zero will cause validation error. Tests that rely on
1/0to generate exceptions should have it changed to code like1/{0, 1}[0] - #3473 JsonRequestResponseSinkFactory provides also 'raw editor', to turn on 'raw editor' add
SinkRawEditorParamName -> "true" - #3608 Use
ZonedDateTimefordate-timeJsonSchema format,OffsetTimefortimeformat.
Code API changes
- #3406 Migration from Scalatest 3.0.8 to Scalatest 3.2.10 - if necessary, see the Scalatest migration guides, https://www.scalatest.org/release_notes/3.1.0 and https://www.scalatest.org/release_notes/3.2.0
- #3431 Renamed
helper-utilstodefault-helpers, separatedMathUtilsfromcomponents-utilstomath-utils, removed dependencies fromhelper-utils - #3420
DeploymentManagerProvider.typeSpecificInitialDatatakes deploymentConfigConfignow - #3493, #3582 Added methods
DeploymentManagerProvider.additionalPropertiesConfig,DeploymentManagerProvider.additionalValidators - #3506 Changed
LocalDateTimetoInstantinOnDeployActionSuccessinlistener-api - #3513 Replace
EspProcesswithCanonicalProcessin all parts of the API except for the compiler. - #3545
TestScenarioRunner.flinkBasedshould be used instead ofNuTestScenarioRunner.flinkBased. Before this, you need toimport pl.touk.nussknacker.engine.flink.util.test.FlinkTestScenarioRunner._ - #3386 Changed
CustomProcessValidatorvalidatemethod. It now receivesCanonicalProcessinstead ofDisplayableProcessand returnsValidatedNel[ProcessCompilationError, Unit]instead ofValidationResult. MovedCustomProcessValidatorfrom modulenussknacker-restmodelin packagevalidationtonussknacker-extensions-api. - #3586 Module
nussknacker-uiwas renamed tonussknacker-designer,ui.confwas renamed todesigner.conf,defaultUiConfing.confrenamed todefaultDesignerConfig.conf
REST API changes
- #3506 Dates returned by REST API (createdAt, modifiedAt, createDate) are now returned in Zulu time, with timezone indication. This affects e.g.
/api/procecesses,/api/processes/{scenarioId},/api/processes/{scenarioId}/activity - #3542 Node additional info path renamed from
nodes/{scenarioId}/additionalDatatonodes/{scenarioId}/additionalInfo
Scenario API changes
- #3471, #3553
RequestResponseMetaData(path)is changed toRequestResponseMetaData(slug).V1_033__RequestResponseUrlToSlugmigration is ready for that, the change also applies to Scenario DSL. - #3513 Scenario DSL returns
CanonicalProcessinstead ofEspProcess. - #3630
SubprocessOutputchanged toSubprocessUsageOutput, changes inOutputVardefinition
Configuration changes
- #3425 Deployment Manager for
request-response-embeddedconfiguration parameters changed:interface->http.interfaceport->http.portdefinitionMetadata->request-response.definitionMetadata
- #3502 Refactor of
KafkaProperties:kafkaAddressproperty has been deprecated. Please providekafkaProperties."bootstrap.servers"instead
Other changes
- #3441 Updated Flink 1.14.5 -> 1.15.2. Some Flink artefacts no longer have Scala version. Test using Flink may need to disable checkpointing or reduce time between checkpoints to prevent timeouts or long waits for tasks to finish.
In version 1.5.0
Configuration changes
- #2992 deploySettings changed to deploymentCommentSettings, now when specified require you to also specify field validationPattern, specifying exampleComment is optional.
- commentSettings fields modified. matchExpression changed to substitutionPattern, link changed to substitutionLink.
- #3165 Config is not exposed over http (GET /api/app/config/) by default. To enable it set configuration
enableConfigEndpointtotrue. - #3223 OAuth2 configuration
defaultTokenExpirationTimechanged todefaultTokenExpirationDuration - #3263 Batch periodic scenarios carry processing type to distinguish scenarios with different categories.
For existing scenarios processing type is migrated to
default. SetdeploymentManager.processingTypetodefaultor update periodic scenarios table with actual processing type value - ideally it should be same value as the periodic engine key inscenarioTypes.
Code API changes
- #2992 OnDeployActionSuccess in ProcessChangeEvent now requires instance of Option[Comment] instead of Option[String] as parameter with deploymentComment information. Added abstract class Comment in listener-api.
- #3136 Improvements: Lite Kafka testkit
ConfluentUtils.serializeRecordToBytesArrayreplaced byConfluentUtils.serializeDataToBytesArrayConfluentUtils.deserializeSchemaIdAndRecordreplaced byConfluentUtils.deserializeSchemaIdAndData
- #3178 Improvements: more complex test scenario runner result:
- Right now each method from
TestScenarioRunnershould returnValidatedNel[ProcessCompilationError, RunResult[R]]where:- Invalid is representation of process compilation errors
- Valid is representation of positive and negative scenario running result
- Right now each method from
- #3255
TestReporterutil class is safer to use in parallel tests, methods require passing scenario name - #3265 #3288 #3297 #3299#3309
#3316 #3322 #3328 #3330 Changes related with UniversalKafkaSource/Sink:
RuntimeSchemaDatais generic - parametrized byParsedSchema(AvroSchema and JsonSchema is supported).NkSerializableAvroSchemarenamed toNkSerializableParsedSchemaSchemaWithMetadatawrapsParsedSchemainstead of AvroSchema.SchemaRegistryProviderrefactoring:- rename
SchemaRegistryProvidertoSchemaBasedSerdeProvider - decouple
SchemaRegistryClientFactoryfromSchemaBasedSerdeProvider
- rename
KafkaAvroKeyValueDeserializationSchemaFactoryrenamed toKafkaSchemaBasedKeyValueDeserializationSchemaFactoryKafkaAvroValueSerializationSchemaFactoryrenamed toKafkaSchemaBasedValueSerializationSchemaFactoryKafkaAvroKeyValueSerializationSchemaFactoryrenamed toKafkaSchemaBasedKeyValueSerializationSchemaFactory
- #3253
DeploymentManagerhas separatevalidatemethod, which should perform initial scenario validation and return reasonably quickly (while deploy can e.g. make Flink savepoint etc.) - #3313 Generic types handling changes:
Typed.typedClass(Class[_], List[TypingResult])is not available anymore. You should use more explicitTyped.genericTypeClassinstead- We check count of generic parameters in
Typed.genericTypeClass- wrong number will cause throwing exception now - We populate generic parameters by correct number of
Unknownin non-generic aware versions ofTypedfactory methods likeTyped.applyorTyped.typedClass
- #3071 More strict Avro schema validation:
ValidationMode.allowOptionalwas removed, instead of it please useValidationMode.laxValidationMode.allowRedundantAndOptionalwas removed, instead of it please useValidationMode.lax- Changes of
ValidationMode, fields:acceptUnfilledOptionalandacceptRedundantwere removed
- #3376
FlinkKafkaSource.flinkSourceFunction,FlinkKafkaSource.createFlinkSourceandDelayedFlinkKafkaConsumer.applytakes additional argument,FlinkCustomNodeContextnow - #3272
KafkaZookeeperServerrenamed toEmbeddedKafkaServer,zooKeeperServerfield changed type toOptionand is hidden now. - #3365 Numerous renames:
- module
nussknacker-avro-components-utils->nussknacker-schemed-kafka-components-utils - module
nussknacker-flink-avro-components-utils->nussknacker-flink-schemed-kafka-components-utils - package
pl.touk.nussknacker.engine.avro->pl.touk.nussknacker.engine.schemedkafka - object
KafkaAvroBaseComponentTransformer->KafkaUniversalComponentTransformer
- module
- #3412 More strict filtering method types. Methods with parameters or result like
Collection[IllegalType]are no longer available in SpEl. - #3542 Numerous renames:
- trait
NodeAdditionalInfo->AdditionalInfo, - class
MarkdownNodeAdditionalInfo->MarkdownAdditionalInfo - trait
NodeAdditionalInfoProvider->AdditionalInfoProvider- the SPI provider's configuration files must be renamed frompl.touk.nussknacker.engine.additionalInfo.NodeAdditionalInfoProvidertopl.touk.nussknacker.engine.additionalInfo.AdditionalInfoProvider - method
AdditionalInfoProvider.additionalInforenamed tonodeAdditionalInfoand new method addedpropertiesAdditionalInfo
- trait
REST API changes
- #3169 API endpoint
/api/app/healthCheckreturning short JSON answer with "OK" status is now not secured - before change it required to be an authenticated user with "read" permission.
Scenario authoring changes
- #3187 #3224 Choice component replaces Switch component. "Default" choice edge type, exprVal and expression are now deprecated. For existing usages, you don't need to change anything. For new usages, if you want extract value e.g. to simplify choice conditions, you need to define new local variable before choice using variable component. "Default" choice edge type can be replaced by adding "true" condition at the end of list of conditions
Breaking changes
- #3328 Due to addition of support for different schema type (AvroSchema and JsonSchema for now) serialization format of
NkSerializableParsedSchemahas changed. Flink state compatibility of scenarios which use Avro sources or sinks has been broken. - #3365 Due to renames (see section
Code API changes) Flink state compatibility of scenarios which use Avro sources or sinks has been broken.
Other changes
- #3249#3250 Some kafka related libraries were bumped: Confluent 5.5->7.2, avro 1.9->1.11, kafka 2.4 -> 3.2.
It may have influence on your custom components if you depend on
kafka-components-utilsoravro-components-utilsmodule - #3376 Behavior of Flink's Kafka deserialization errors handling was changed - now instead of job failure, invalid message is omitted and configured
exceptionHandlermechanism is used.
In version 1.4.0
Configuration changes
security.rolesClaimchanged tosecurity.rolesClaims, type changed to list of stringskafka.schemaRegistryCacheConfigconfiguration entry was added - it was hardcoded before. Default value ofkafka.schemaRegistryCacheConfig.availableSchemasExpirationTimewas changed from 1 minute to 10 seconds which will cause more often schema cache invalidation- #3031 Attachments are now stored in database (see more in section
Other changes).attachmentsPathwas removed. Optional configattachments.maxSizeInByteswas introduced with default value of 10mb
Code API changes
- #2983 Extract Permission to extensions-api
- Moved
pl.touk.nussknacker.ui.security.api.Permission(security module) topl.touk.nussknacker.security.Permission(extension-api module)
- Moved
- #3040 Deprecated
pl.touk.nussknacker.engine.api.ProcessListener.sinkInvokedmethod. Switch to more generalendEncounteredmethod. - #3076 new implicit parameter
componentUseCase: ComponentUseCasewas added toinvoke()method of all services extendingEagerServiceWithStaticParameters
Other changes
- #3031 Attachments are now stored in database. As this feature was rarely used, automatic migration of attachments from disk to db is not provided. To stay consistent db table
process_attachmentshad to be truncated.
Breaking changes
- #3029
KafkaConfighas new fieldschemaRegistryCacheConfig: SchemaRegistryCacheConfig. Flink state compatibility has been broken. - #3116 Refactor
SchemaRegistryClientFactoryso it takes dedicated config object instead of KafkaConfig. This change minimizes chance of future Flink state compatibility break.SchemaIdBasedAvroGenericRecordSerializeris serialized in Flink state, so we provide it now with as little dependencies as necessary. Flink state compatibility has been broken again. - #3363 Kafka consumer no longer set
auto.offset.resettoearliestby default. For default configuration files, you can useKAFKA_AUTO_OFFSET_RESETenv variable to easily change this setting.
In version 1.3.0
Code API changes
- #2741 #2841 Remove custom scenario provides some changes on API:
- Replace ProcessDeploymentData by CanonicalProcess (as VO)
- Replace scenario jsonString by CanonicalProcess at DeploymentManager, ProcessConfigEnricherInputData
- #2773 Using VersionId / ProcessId / ProcessName instead of Long or String:
PullProcessRepositoryAPI was changed, right now we use VersionId instead of Long
- #2830
RunModeis renamed toComponanteUseCaseandNormalvalue is split into: EngineRuntime, Validation, ServiceQuery, TestDataGeneration.RunMode.TestbecomesComponanteUseCase.TestRuntime - #2825, #2868 #2912 API modules changes:
- Extracted new modules:
nussknacker-scenario-apiwith all scenario API parts fromapiandinterpreternussknacker-components-api(andnussknacker-lite-components-api,nussknacker-flink-components-apietc.), which contain API for creating componentsnussknacker-common-api- base value classes shared betweenscenario-apiandcomponents-apilikeNodeId,Metadataetc.nussknacker-extensions-api- API of extensions other than components
- Because of that, some changes in code were also introduced:
NodeIdmoved frompl.touk.nussknacker.engine.api.context.ProcessCompilationErrortopl.touk.nussknacker.engine.apiNodeExpressionId,DefaultExpressionIdandbranchParameterExpressionIdmoved frompl.touk.nussknacker.engine.api.context.ProcessCompilationErrortopl.touk.nussknacker.engine.graph.expressionJobDatano longer containsDeploymentData, which is not accessible for components anymoreDisplayJson,WithJobData,MultiMapmoved toutils- Some methods from API classes (e.g.
Parameter.validate) and classes (InterpretationResult) moved to interpreter DeploymentManagerProvider.createDeploymentManagertakes nowBaseModelDataas an argument instead ofModelData. If you want to use this data to invoke scenario, you should cast it to invokable representation via:import ModelData._; modelData.asInvokableModelData
- Extracted new modules:
- #2878 #2898 #2924 Cleaning up of
-utilsmodules- Extracted internal classes, not intended to be used in extensions to nussknacker-internal-utils module
- Extracted component classes, not used directly by runtime/designer to nussknacker-components-utils module
- Extracted kafka component classes, not used directly by lite-kafka-runtime/kafka-test-utils to nussknacker-kafka-components-utils
- Moved some classes that are in fact part of API to -api modules (e.g.
ToJsonEncoder) - Module renames:
- nussknacker-avro-util to nussknacker-avro-components-utils
- nussknacker-flink-avro-util to nussknacker-flink-avro-components-utils
- nussknacker-flink-kafka-util to nussknacker-flink-kafka-components-utils
- nussknacker-flink-util to nussknacker-flink-components-utils
- nussknacker-request-response-util to nussknacker-request-response-components-utils
- nussknacker-model-util to nussknacker-helpers-utils
- Minor changes in code:
- Use
val docsConfig = new DocsConfig(config); import docsConfig._instead ofimplicit val docsConfig = (...); import DocsConfig._ - Some components specific methods are not available from
KafkaUtils. Instead, they are available fromKafkaComponentsUtils ToJsonEncoder.encodertakesAny => Jsonfunction instead ofBestEffortJsonEncoderas a parameter
- Use
- #2907 Hide some details of metrics to
utils-internal(InstantRateMeter,InstantRateMeterWithCount), use method added toMetricsProviderForScenario - #2916 Changes in
ProcessStateAPI.- Six similar methods creating
ProcessStatebased onStateStatusand some other details merged to one.- Methods removed:
- Two variants of
ProcessState.applytakingProcessStateDefinitionManageras a parameter SimpleProcessState.apply- Two variants of
ProcessStatus.simple ProcessStatus.createStatetakingProcessStateDefinitionManageras a parameter
- Two variants of
- Method added:
ProcessStateDefinitionManager.processStatewith some default parameter values
- Methods removed:
ProcessStatusclass is removed at all. All methods returningProcessStateby it moved toSimpleProcessStateDefinitionManagerand removedpreviousState: Option[ProcessState]from it. If you want to keep previous state's deployment details and only change "status details" just useprocessState.withStatusDetailsmethodProcessState,CustomActionand its dependencies moved fromnussknacker-deployment-manager-apitonussknacker-scenario-deployment-api,restmodelmodule not depend ondeployment-manager-apianymore- #2969 Action
ProcessActionType.Deployis now available by default for scenarios inSimpleStateStatus.DuringDeploystate. Mind this if you depend onOverridingProcessStateDefinitionManagerorSimpleProcessStateDefinitionManager, and specifically on theirsstatusActionsmethod. As an exception, implementation for FlinkFlinkProcessStateDefinitionManagerstays the same as before (onlyProcessActionType.Cancelis possible in this state), but this may be unified in the future.
- Six similar methods creating
Other changes
- #2886 This change can break previous flink snapshot compatibility. Restoring state from previous snapshot asserts that restored serializer UID matches current serializer UID. This change ensures that in further release deployments UIDs persisted within snapshots are not re-generated in runtime.
- #2950 Remove
MATHhelper, useNUMERICmethods (they work better with some number types conversions)
In version 1.2.0
Configuration changes
- #2483
COUNTS_URLenvironment variable is notINFLUXDB_URL, withoutquerypath part. - #2493 kafka configuration should be moved to components provider configuration - look at
components.kafkain dev-application.conf for example - #2624 Default name for
processtag is nowscenario. This affects metrics and count functionalities. Please update you Flink/Telegraf setup accordingly (see nussknacker-quickstart for details). If you still want to useprocesstag (e.g. you have a lot of dashboards), please setcountsSettings.metricsConfig.scenarioTagsetting toprocessAlso, dashboard links format changed, see documentation for the details. - #2645 Default models:
genericModel.jar,liteModel.jar. were merged todefaultModel.jar,managementSample.jarwas renamed todevModel.jar. If you usedefaultModel.jarit's important to includeflinkExecutor.jarexplicitly on model classpath.
Scenario authoring changes
- #2564 Flink union now takes only 'Output expression' parameters for branches (previously 'value' parameter), output variable must be of the same type, if you want to distinguish source branch in output variable please use map variable, example in Basic Nodes docs.
Other changes
- #2554 Maven artifact
nussknacker-kafka-flink-utilbecomenussknacker-flink-kafka-utilandnussknacker-avro-flink-utilbecomenussknacker-flink-avro-util. General naming convention isnussknacker-$runtimeType-$moduleName. Components inside distribution changed layout tocomponents(/$runtimeType)/componentName.jare.g.components/flink/kafka.jarorcomponents/openapi.jarKafkaSourcebecomeFlinkKafkaSource,ConsumerRecordBasedKafkaSourcebecomeFlinkConsumerRecordBasedKafkaSource,KafkaSinkbecomeFlinkKafkaSink,KafkaAvroSinkbecomeFlinkKafkaAvroSink - #2535, #2625, #2645 Rename
standalonetorequest-response:- Renamed modules and artifacts
StandaloneMetaDatais nowRequestResponseMetaData- Move
request-responsemodules tobasedir. standalonein package names changed torequestresponseStandalonein class/variable names changed toRequestResponseDeploymentManager/Serviceuses dedicated format of status DTO, instead of the ones fromdeployment-manager-api- Removed old, deprecated
jarPathsettings, in favour ofclassPathused in other places - Extracted
nussknacker-lite-request-response-componentsmodule
- #2582
KafkaUtils.toProducerPropertiessetup only basic properties now (bootstrap.serversand serializers) - before the change it was setting options which are not always good choice (for transactional producers wasn't) - #2600
ScenarioInterpreter,ScenarioInterpreterWithLifecyclenow takes additional generic parameter:Input.ScenarioInterpreter.invoketakesScenarioInputBatchwhich now contains list ofSourceId -> Inputinstead ofSourceId -> Context. Logic ofContextpreparation should be done inLiteSourceinstead of beforeScenarioInterpreter.invoke. invocation It means thatLiteSourcealso takes this parameter and have a new methodcreateTransformation. - #2635
ContextInitializer.initContextnow takesContextIdGeneratorinstead ofnodeIdand returns just a function with strategy of context initialization instead of serializable function withLifecycle. To use it with Flink engine, useFlinkContextInitializingFunctionwrapper. - #2649
DeploymentManagerProvidertakes newProcessingTypeDeploymentServiceclass as an implicit parameter - #2564 'UnionParametersMigration' available to migrate parameter name from 'value' to 'Output expression' - please turn it on you are using 'union' like component
- #2645 Simplify structure of available models (implementations of
ProcessConfigCreator).defaultModel.jarand components should be used instead of custom implementations ofProcessConfigCreator, the only exception is when one wants to customizeExpressionConfig. Also,nussknacker-flink-enginemodule becamenussknacker-flink-executor. - #2651
ValidationContext.clearVariablesnow clears also parent reference. Important when invoked inside fragments. - #2673
KafkaZookeeperUtilsrenamed toKafkaTestUtils, it doesn't depend on ZooKeeper anymore. - #2686
ServiceWithStaticParametersrenamed toEagerServiceWithStaticParameters. - #2695
nodeIdreplaced withNodeComponentInfoinNuExceptionInfo. Simple wrapper class which holds the samenodeIdand alsocomponentInfo. Migration is straightforward, just putnodeIdinto the new case class:NuExceptionInfo(None, exception, context)=> stays the sameNuExceptionInfo(Some(nodeId), exception, context)=>NuExceptionInfo(Some(NodeComponentInfo(nodeId, None)), exception, context)- if an exception is thrown inside the component, additional information can be provided:
- for base component (like
filterorsplit):NodeComponentInfo.forBaseNode("nodeId", ComponentType.Filter) - for other:
NodeComponentInfo("nodeId", ComponentInfo("kafka-avro-source", ComponentType.Source))
- for base component (like
- if an exception is thrown inside the component, additional information can be provided:
- The same migration has to be applied to
ExceptionHandler.handling()method.
- #2824 'ProcessSplitterMigration' available to migrate node name from 'split' to 'for-each' (see #2781)- please turn it on if you are using 'split' component
In version 1.1.0
Summary:
- A lot of internal refactoring was made to separate code/API specific for Flink.
If your deployment has custom components pay special attention to:
Lifecyclemanagement- Kafka components
- Differences in artifacts and packages
- Some of the core dependencies: cats, cats-effect and circe were upgraded. It affects mainly code, but it may also have impact on state compatibility and performance.
- Default Flink version was bumped do 1.14 - see https://github.com/TouK/nussknacker-flink-compatibility on how to run Nu on older Flink versions.
- Execution of SpEL expressions is now checked more strictly, due to security considerations. These checks can be overridden with custom
ExpressionConfig.
- Apart from that:
- minor configuration naming changes
- removal of a few of minor, not documented features (e.g. SQL Variable)
- #2208 Upgrade, cats, cats-effects, circe. An important nuisance: we didn't upgrade sttp, so we cannot depend on
"com.softwaremill.sttp.client" %% "circe". Instead, the code is copied. Make sure you don't include sttp-circe integration as transitive dependency, but use class from http-utils instead. - #2176
EnrichDeploymentWithJarDataFactorywas replaced withProcessConfigEnricher. - #2278 SQL Variable is removed
- #2280 Added optional
defaultValuefield toParameter. InGenericNodeTransformationcan be set toNone- values will be determined automatically. - #2289 Savepoint path in
/api/adminProcessManagement/deployendpoint is passed as asavepointPathparameter instead of path segment. - #2293 Enhancement: change
nodeCategoryMappingconfiguration tocomponentsGroupMapping - #2301 #2620
GenericNodeTransformation.initialParameterswas removed - nowGenericNodeTransformation.contextTransformationis used instead. To make Admin tab -> Invoke service form working, useWithLegacyStaticParameterstrait - #2409
JsonValidatoris now not determined by default based onJsonParameterEditorbut must be explicitly defined by@JsonValidatorannotation - #2304 Upgrade to Flink 1.14. Pay attention to Flink dependencies - in some (e.g. runtime) there is no longer scala version.
- #2295
FlinkLazyParameterFunctionHelperallows (and sometimes requires) correct exception handling - #2307 Changed
nussknacker-kafkamodule name tonussknacker-kafka-util - #2310 Changed
nussknacker-processmodule name tonussknacker-flink-engine - #2300 #2343 Enhancement: refactor and improvements at components group:
- Provided
ComponentGroupNameas VO SingleNodeConfigwas renamed toSingleComponentConfigand moved frompl.touk.nussknacker.engine.api.processpackage topl.touk.nussknacker.engine.api.component- Configuration
categoryin node configuration was replaced bycomponentGroup - Configuration
nodesin model configuration was replaced bycomponentsUiConfig - Additional refactor:
ProcessToolbarServicemoved frompl.touk.nussknacker.ui.servicepackage topl.touk.nussknacker.ui.process - Additional refactor:
ProcessToolbarServicemoved frompl.touk.nussknacker.ui.servicepackage topl.touk.nussknacker.ui.process DefinitionPreparerwas renamed toComponentDefinitionPreparerNodesConfigCombinerwas removed- REST API /api/processDefinitionData/* response JSON was changed:
nodesToAddwas renamed tocomponentGroupsposibleNodewas renamed tocomponentsnodesConfigwas renamed tocomponentsConfig- config
iconproperty fromcomponentsConfigright now should be relative tohttp.publicPathe.g./assets/components/Filter.svg(before was justFilter.svg) or url (withhttp/https)
- Provided
- #2346 Remove
endResultfromSinkin graph.Sinkno longer definestestOutputmethod - they should be handled by respective implementations- Change in definition of
StandaloneSinkpreviouslyStandaloneSinkWithParameters, as output always has to be computed with sink parameters now - Changes in definition of
FlinkSink, to better handle capturing test data - Removal of
.sinkmethod inGraphBuilder- use.emptySinkif suitable
- #2331
KafkaAvroBaseTransformercompanion object renamed toKafkaAvroBaseComponentTransformerKryoGenericRecordSchemaIdSerializationSupportrenamed toGenericRecordSchemaIdSerializationSupport
- #2305 Enhancement: change
processingTypeToDashboardconfiguration toscenarioTypeToDashboard - #2296 Scenarios & Fragments have separate TypeSpecificData implementations. Also, we remove
isSubprocessfield from process JSON, and respectively from MetaData constructor. See corresponding db migrationV1_031__FragmentSpecificData.scala - #2368
WithCategoriesnow takes categories as anOption[List[String]]instead ofList[String]. You should wrap given list of categories withSome(...).Nonemean that component will be available in all categories. - #2360
union,union-memoanddead-endcomponents were extracted frommodel/genericModel.jartocomponents/baseComponents.jarIf you have your ownapplication.confwhich changesscenarioTypes, you should add"components/baseComponents.jar"entry intoclassPatharray - #2337 Extract base engine from standalone
- Common functionality of base engine (i.e. microservice based, without Flink) is extracted to
base-apiandbase-runtime - new API for custom components (
pl.touk.nussknacker.engine.baseengine.api.customComponentTypes) StandaloneProcessInterpreterbecomesStandaloneScenarioEngine- Replace
Either[NonEmptyList[Error], _]withValidatedNel[Error, _]as return type StandaloneContextbecomesEngineRuntimeContext
- Common functionality of base engine (i.e. microservice based, without Flink) is extracted to
- #2349
queryable-statemodule was removed,FlinkQueryableClientwas moved tonussknacker-flink-manager.PrettyValidationErrors,CustomActionRequestandCustomActionResponsemoved fromnussknacker-uitonussknacker-restmodel. - #2361 Removed
securitydependency fromlistener-api.LoggedUserreplaced with dedicated class inlistener-api. - #2385 Deprecated
CustomStreamTransformer.clearsContextwas removed. Use
@MethodToInvoke
def execute(...) =
ContextTransformation
.definedBy(ctx => Valid(ctx.clearVariables ...))
.implementedBy(...)
}
instead.
- #2348 #2459 #2486
#2490 #2496 #2536
Introduce
KafkaDeserializationSchemaandKafkaSerializationSchematraits to decouple from flink dependency. moveKeyedValuetonussknacker-util, moveSchemaRegistryProvidertoutils/avro-utilTo move between nussknacker's/flink's Kafka(De)serializationSchema usewrapToFlink(De)serializatioinSchemafromFlinkSerializationSchemaConversions.SchemaRegistryProviderandConfluentSchemaRegistryProvideris now innussknacker-avro-utilmodule.FlinkSourceFactoryis gone - useSourceFactoryinstead.KafkaSourceFactory,KafkaAvroSourceFactory,KafkaSinkFactory,KafkaAvroSinkFactory, andContextIdGeneratornot depends on flink. ExtractedKafkaSourceImplFactory,KafkaSinkImplFactoryandKafkaAvroSinkImplFactorywhich deliver implementation of component (after all validations and parameters evaluation). Use respectively:FlinkKafkaSourceImplFactory,FlinkKafkaSinkImplFactoryandFlinkKafkaAvroSinkImplFactoryto deliver flink implementations. Moved non-flink specific serializers, deserializers,BestEffortAvroEncoder,ContextIdGenerators andRecordFormatters to kafka-util/avro-utilKafkaDelayedSourceFactoryis nowDelayedKafkaSourceFactory.FixedRecordFormatterFactoryWrappermoved toRecordFormatterFactory - #2477
FlinkContextInitializerandFlinkGenericContextInitializermerged toContextInitializer,BasicFlinkContextInitializerandBasicFlinkGenericContextInitializermerged toBasicContextInitializer. All of them moved topl.touk.nussknacker.engine.api.processpackage.ContextInitializer.validationContextreturnsValidatedNel- before this change errors during context initialization weren't accumulated.ContextInitializingFunctionnow is a scala's function instead of Flink's MapFunction. You should wrap it withRichLifecycleMapFunctionto make sure that it will be opened correctly by Flink.InputMetawas moved tokafka-utilmodule. - #2389 #2391
deployment-manager-apimodule was extracted andDeploymentManagerProvider,ProcessingTypeDataandQueryableClientwas moved frominterpreterinto it.DeploymentManager,CustomActionandProcessStatewas moved fromapitodeployment-manager-api.ProcessingTypewas moved torest-modelpackage. - #2393 Added
ActorSystem,ExecutionContextandSttpBackendintoDeploymentManagerProvider.createDeploymentManager. During clean ups also was removednussknacker-http-utilsdependency toasync-http-client-backend-futureand addedSttpBackendtoCountsReporterCreator.createReporterarguments. - #2397 Common
EngineRuntimeContextlifecycle andMetricsProvider. This may cause runtime consequences - make sure your custom services/listeners invokeopen/closecorrectly - especially in complex inheritance scenarios.Lifecyclehas nowEngineRuntimeContextas parameter,JobDatais embedded in it.TimeMeasuringServicereplacesGenericTimeMeasuringService, Flink/Standalone flavours ofTimeMeasuringServiceare removedEngineRuntimeContextandMetricsProvidermoved to base API,RuntimeContextLifecyclemoved to base API asLifecycleGenericInstantRateMeteris nowInstantRateMeter- Flink
RuntimeContextLifecycleshould be replaced in most cases byLifecycle - In Flink engine
MetricsProvider(obtained withEngineRuntimeContext) should be used in most places instead ofMetricUtils
- #2486
Context.withInitialIdis deprecated now - useEngineRuntimeContext.contextIdGeneratorinstead.EngineRuntimeContextcan be accessible viaFlinkCustomNodeContext.convertToEngineRuntimeContext - #2377 #2534 Removed
clazzfromSourceFactory. Remove generic parameter fromSourceandSourceFactory. Return type of source should be returned either by:returnTypefield of@MethodToInvokeContextTransformationAPIGenericNodeTransformerAPISourceFactory.noParam
- #2453 Custom actions for
PeriodicDeploymentManagernow can be defined and implemented outside this class, inPeriodicCustomActionsProvidercreated byPeriodicCustomActionsProviderFactory. If you do not need them, just passPeriodicCustomActionsProviderFactory.noOpto object'sPeriodicDeploymentManagerfactory method. - #2501
nussknacker-baseengine-componentsmodule renamed tonussknacker-lite-base-components - #2221 ReflectUtils
fixedClassSimpleNameWithoutParentModulerenamed tosimpleNameWithoutSuffix - #2495 TypeSpecificDataInitializer trait change to TypeSpecificDataInitializ
- #2245
FailedEventhas been specified inFailedOnDeployEventandFailedOnRunEvent
In version 1.0.0
- #1439 #2090 Upgrade do Flink 1.13.
setTimeCharacteristicis deprecated, and should be handled automatically by Flink.UserClassLoaderwas removed, use appropriate Flink objects or context ClassLoader.- RocksDB configuration is turned on by
rocksdb.enableinstead ofrocksdb.checkpointDataUriwhich is not used now.
- #2133 SQL Variable is hidden in generic model, please look at comment in
defaultModelConfig.conf - #2152
schedulePropertyExtractorparameter ofPeriodicDeploymentManagerProviderwas changed to a factory, replace with a lambda creating the original property extractor. - #2159
useTypingResultTypeInformationoption is now enabled by default - #2108 Changes in
ClassExtractionSettings:- Refactor of classes defining extraction rules,
TypedClasshas privateapplymethod, please useTyped.typedClass- Fewer classes/methods are accessible in SpEL, in particular Scala collections, internal time API, methods returning or having parameters from excluded classes
- Changes in
OAuth2security components:- refactoring of
OpenIdConnectService, now it's namedGenericOidcService(it's best to useOidcService, which can handle most of the configuration automatically)
- refactoring of
- New security settings, in particular new flags in
ExpressionConfig:strictMethodsCheckingstaticMethodInvocationsCheckingmethodExecutionForUnknownAlloweddynamicPropertyAccessAllowedspelExpressionExcludeList
- #2101 Global permissions can be arbitrary string, for admin user it's not necessary to return global permissions
- #2182 To avoid classloader leaks during SQL
DriverManagerregistration, HSQLDB (used e.g. for SQL Variable) is no longer included in model jars, it should be added in Flinklibdir
In version 0.4.0
-
#1479
ProcessIdandVersionIdmoved to API included inProcessVersion, remove spuriousProcessIdandProcessVersionIdin restmodel. -
#1422 Removed
ServiceReturningTypeandWithExplicitMethod, useEagerServiceWithStaticParameters,EnricherContextTransformationorSingleInputGenericNodeTransformation -
#1845
AuthenticatorDatahas been renamed toAuthenticationResourcesand changed into a trait,applyconstruction has been preserved.AuthenticatorFactoryand itscreateAuthenticatormethod has been renamed toAuthenticationProviderandcreateAuthenticationResources. It is recommended to rename the main class of any custom authentication module to<Something>AuthenticationProvideraccordingly. -
#1542
KafkaConfignow has new parametertopicsExistenceValidationConfig. WhentopicsExistenceValidationConfig.enabled = trueKafka sources/sinks do not validate if provided topic does not exist and cluster is configured withauto.create.topics.enable=false -
#1416
OAuth2Servicehas changed. You can still use your old implementation by importingOAuth2OldServicewith an alias.OAuth2ServiceFactory.createmethod now accepts implicit parameters for anExecutionContextandsttp.HttpBackend. You can ignore them to maintain previous behaviour, but it is always better to use them instead of locally defined ones. -
#1346
AggregatorFunctionnow takes type of stored state that can beimmutable.SortedMap(previous behaviour) orjava.util.Map(using Flink's serialization) andvalidatedStoredTypeparameter for providing betterTypeInformationfor aggregated values -
#1343
FirstAggregatorchanged serialized state, it is not compatible,Aggregatortrait has new methodcomputeStoredType -
#1352 and #1568 AvroStringSettings class has been introduced, which allows control whether Avro type
stringis represented byjava.lang.String(also in runtime) orjava.lang.CharSequence(implemented in runtime byorg.apache.avro.util.Utf8). This setting is available through environment variableAVRO_USE_STRING_FOR_STRING_TYPE- default istrue. Please mind that this setting is global - it applies to all processes running on Flink and also requires restarting TaskManager when changing the value. -
#1361 Lazy variables are removed, you should use standard enrichers for those cases. Their handling has been source of many problems and they made it harder to reason about the exeuction of process.
-
#1373 Creating
ClassLoaderModelDatadirectly is not allowed, useModelData.applywith plain config, wrapping with ModelConfigToLoad by yourself is not needed. -
#1406
ServiceReturningTypeis deprecated in favour ofEagerService -
#1445
RecordFormatternow handlesTestDataSplitfor Kafka sources. It is required inKafkaSourcecreation, instead ofTestDataSplit -
#1433 Pass DeploymentData to process via JobData, additional parameters to deployment methods are needed. Separate
ExternalDeploymentIdfromDeploymentId(generated by NK) -
#1466
ProcessManager.deploycan returnExternalDeploymentId -
- Slight change of API of
StringKeyedValueMapper - Change of semantics of some parameters of
AggregatorFunction,AggregatorFunctionMixin(storedAggregateType becomes aggregateElementType)
- Slight change of API of
-
#1405 'KafkaAvroSink' requires more generic 'AvroSinkValue' as value parameter
-
- Change of
FlinkSourceAPI: sourceStream produces stream of initializedContext(DataStream[Context]) This initialization step was previously performed withinFlinkProcessRegistrar.registerSourcePart. Now it happens explicitly within the flink source. FlinkIntermediateRawSourceis used as an extension to flink sources, it prepares source with typical stream transformations (add source function, set uid, assign timestamp, initializeContext)FlinkContextInitializeris used to initializeContext. It provides map function that transforms raw event (produced by flink source function) intoContextvariable. Default implementation ofFlinkContextInitializer, seeBasicFlinkContextInitializer, sets raw event value to singe "input" variable.- For sources based on
GenericNodeTransformationit allows to initializeContextwith more than one variable. Default implementation of initializer, seeBasicFlinkGenericContextInitializer, provides default definition of variables as aValidationContextwith single "input" variable. The implementation requires to provide separately the definition of "input" variable type (TypingResult). SeeGenericSourceWithCustomVariablesSample. - To enable "test source" functionality, a source needs to be extended with
SourceTestSupport. - For flink sources that use
TestDataParserProviderswitch toFlinkSourceTestSupport(which is used to provide "test source" functionality for flink sources). - Old
TestDataParserProvideris renamed toSourceTestSupport - To enable test data generator for "test source" , a source needs to be extended with both
SourceTestSupportandTestDataGenerator. What was related to "test source" functionality and was obsolete inFlinkSourcenow is excluded toFlinkSourceTestSupport. FlinkCustomNodeContexthas access toTypeInformationDetection, it allows to get TypeInformation for the node stream mapping from ValidationContext.- For kafka sources
RecordFormatterparses raw test data toConsumerRecordwhich fits into deserializer (instead ofProducerRecordthat required another transformation). - Definitions of names of common
Contextvariables are moved toVariableConstants(instead ofInterpreter).
- Change of
-
#1497 Changes in
PeriodicProcessManager, changePeriodicPropertytoScheduleProperty -
- trait
KafkaAvroDeserializationSchemaFactoryuses both key and value ClassTags and schemas (instead of value-only), check the order of parameters. - ClassTag is provided in params in avro key-value deserialization schema factory:
KafkaAvroKeyValueDeserializationSchemaFactory BaseKafkaAvroSourceFactoryis able to read both key and value schema determiner to build proper DeserializationSchema (support for keys is not fully introduced in this change)
- trait
-
#1514
ExecutionConfigPreparerhas different method parameter -JobData, which has more info than previous parameters -
#1532
TypedObjectTypingResult#fieldsuses nowscala.collection.immutable.ListMapto keep fields order -
#1546
StandaloneCustomTransformernow takes a list ofContextobjects, to process them in one go -
#1557 Some classes from standalone engine were moved to standalone api to remove engine to (model) utils dependency:
StandaloneContext,StandaloneContextLifecycle,MetricsProvider -
#1558
FlinkProcessRegistrartakes configuration directly fromFlinkProcessCompiler(this can affect some tests setup) -
#1631 Introduction of
nussknacker.config.locationsproperty, drop use of standardconfig.fileproperty. Model configuration no longer has direct access to root UI config. -
- Replaced
KafkaSourceFactorywith source based onGenericNodeTransformation, which gives access to setup ofValidationContextandContextinitialization. To migrateKafkaSourceFactory:- provide deserializer factory (source factory requires deserialization to
ConsumerRecord):- use
ConsumerRecordDeserializationSchemaFactorywith currentDeserializationSchemaas a value deserializer, add key deserializer (e.g. org.apache.kafka.common.serialization.StringDeserializer) - or use
FixedValueDeserializationSchemaFactorywith simple key-as-string deserializer
- use
- provide RecordFormatterFactory
- use
ConsumerRecordToJsonFormatterFactoryfor whole key-value-and-metadata serialization - or, for value-only-and-without-metadata scenario, you can use current
RecordFormaterwrapped inFixedRecordFormatterFactoryWrapper
- use
- provide timestampAssigner that is able to extract time from
ConsumerRecord[K, V]
- provide deserializer factory (source factory requires deserialization to
- Removed
BaseKafkaSourceFactorywith multiple topics support: useKafkaSourceFactoryinstead, see "source with two input topics" test case - Removed
SingleTopicKafkaSourceFactory: useKafkaSourceFactorywith customprepareInitialParameters,contextTransformationandextractTopicsto alter parameter list and provide constant topic value. TypingResultAwareTypeInformationCustomisationis moved to package pl.touk.nussknacker.engine.flink.api.typeinformation
Example of source with value-only deserialization and custom timestampAssigner:
// provide new deserializer factory with old schema definition for event's value
val oldSchema = new EspDeserializationSchema[SampleValue](bytes => io.circe.parser.decode[SampleValue](new String(bytes)).toOption.get)
val schemaFactory: KafkaDeserializationSchemaFactory[ConsumerRecord[String, SampleValue]] = new FixedValueDeserializationSchemaFactory(oldSchema)
// ... provide timestampAssigner that extracts timestamp from SampleValue.customTimestampField
// ... or use event's metadata: record.timestamp()
def timestampExtractor(record: ConsumerRecord[String, SampleValue]): Long = record.value().customTimestampField
val watermarkHandler = StandardTimestampWatermarkHandler.boundedOutOfOrderness[ConsumerRecord[String, SampleValue]](timestampExtractor, java.time.Duration.ofMinutes(10L))
val timestampAssigner: Option[TimestampWatermarkHandler[ConsumerRecord[String, SampleValue]]] = Some(watermarkHandler)
// ... provide RecordFormatterFactory that allows to generate and parse test data with key, headers and other metadata
val formatterFactory: RecordFormatterFactory = new ConsumerRecordToJsonFormatterFactory[String, SampleValue]
// ... and finally
val sourceFactory = new KafkaSourceFactory[String, SampleValue](schemaFactory, timestampAssigner, formatterFactory, dummyProcessObjectDependencies) - Replaced
-
#1651
KafkaAvroSourceFactoryprovides additional #inputMeta variable with event's metadata.- That source now has key and value type parameters. That parameters are relevant for sources handling
SpecificRecords. ForGenericRecordsuse explicitlyKafkaAvroSourceFactory[Any, Any]. SpecificRecordKafkaAvroSourceFactoryextends wholeKafkaAvroSourceFactorywith context validation and initialization- New flag in
KafkaConfig:useStringForKeydetermines if event's key should be intepreted as ordinary String (which is default scenario). It is used in deserialization and for generating/parsing test data. SchemaRegistryProvidernow provides factories to produce SchemaRegistryClient and RecordFormatter.- For
ConfluentSchemaRegistryProviderKafkaConfig and ProcessObjectDependencies (that contains KafkaConfig data) are no longer required. That configuration is required by factories in the moment the creation of requested objects that happens inKafkaAvroSourceFactory(and that makes that all objects withinKafkaAvroSourceFactorysee the same kafka configuration). - Removed:
BaseKafkaAvroSourceFactory, the class is incorporated intoKafkaAvroSourceFactoryto provide elastic approach to create KafkaSourcewith ReturningTypefor generic types (this is defined by ValidationContext, see alsoKafkaContextInitializerthat allows to return more than one variable)KafkaAvroValueDeserializationSchemaFactory(source requires deserialization toConsumerRecord[K, V], there are only deserializers based onKafkaAvroKeyValueDeserializationSchemaFactory)ConfluentKafkaAvroDeserializationSchemaFactory, useConfluentKeyValueKafkaAvroDeserializationFactoryTupleAvroKeyValueKafkaAvroDeserializerSchemaFactory, this approach is deprecated due to #inputMeta variable that contains key data
To migrate
KafkaAvroSourceFactory:- Provide
KafkaConfigwith correctuseStringForKeyflag value. By default we want to EvictableStatehandle keys as ordinary String and all topics related to such config require only value schema definitions (key schemas are ignored). For specific scenario, when complex key with its own schema is provided, this flag is false and all topics related to this config require both key and value schema definitions. Example of default KafkaConfig override:override protected def prepareKafkaConfig: KafkaConfig = super.prepareKafkaConfig.copy(useStringForKey = false) - provide your own
SchemaRegistryProvider(or useConfluentSchemaRegistryProvider) - custom RecordFormatter can be wrapped in
FixedRecordFormatterFactoryWrapper(or keepConfluentAvroToJsonFormatterFactory) - provide timestampAssigner that is able to extract time from
ConsumerRecord[K, V](see example above)
- That source now has key and value type parameters. That parameters are relevant for sources handling
-
#1741 Minor changes in
KafkaUtils,NonTransientExceptionusesInstantinstead ofLocalDateTime -
#1806 Remove old, deprecated API:
EvictableState,RichEvictableState- useEvictableStateFunctioncheckpointInterval- usecheckpointConfig.checkpointInterval- old versions of
sampleTransformers- use newer ones MiniClusterExecutionEnvironment.runningJobs()- useflinkMiniClusterHolder.runningJobs()
-
#1807 Removed
jdbcServer, please use Postgres for production-ready setups -
- RecordFormatterFactory instead of one, uses two type parameters: K, V
- ConfluentAvroToJsonFormatter is produced by ConfluentAvroToJsonFormatterFactory
- ConfluentAvroToJsonFormatter produces test data in valid JSON format, does not use Separator
- ConfluentAvroMessageFormatter has asJson method instead of writeTo
- ConfluentAvroMessageReader has readJson method instead of readMessage Example test data object:
{"keySchemaId":null,"valueSchemaId":1,"consumerRecord":{"key":null,"value":{"first":"Jan","last":"Kowalski"},"topic":"testAvroRecordTopic1","partition":0,"offset":0,"timestamp":1624279687756,"timestampType":"CreateTime","headers":{},"leaderEpoch":0}} -
#1663 Default
FlinkExceptionHandlerimplementations are deprecated, useConfigurableExceptionHandlerinstead. -
#1731 RockDB config's flag
incrementalCheckpointsis turned on by default. -
#1825 Default dashboard renamed from
flink-esptonussknacker-scenario -
#1836 Change default
kafka.consumerGroupNamingStrategytoprocessId-nodeId. -
#1357 Run mode added to nodes.
ServiceInvokerinterface was extended with new, implicitrunModeparameter. -
#1836 Change default
kafka.consumerGroupNamingStrategytoprocessId-nodeId. -
#1886 aggregate-sliding with emitWhenEventLeft = true, aggregate-tumbling and aggregate-session components now doesn't emit full context of variables that were before node (because of performance reasons and because that wasn't obvious which one context is emitted). If you want to emit some information other than aggregated value and key (availabled via new
#keyvariable), you should use#AGG.mapexpression inaggregateBy. -
#1910
processTypesrenamed toscenarioTypes. You can still use oldprocessTypesconfiguration. Old configuration will be removed in version0.5.0. -
Various naming changes:
In version 0.3.0
-
#1313 Kafka Avro API passes
KafkaConfigduringTypeInformationdetermining -
#1305 Kafka Avro API passes
RuntimeSchemaDatainstead ofSchemain various places -
#1304
SerializerWithSpecifiedClasswas moved toflink-apimodule. -
#1044 Upgrade to Flink 1.11. Current watermark/timestamp mechanisms are deprectated in Flink 1.11, new API
TimestampWatermarkHandleris introduced, withLegacyTimestampWatermarkHandleras wrapper for previous mechanisms. -
#1244
Parameterhas new parameter 'variablesToHide' withSetof variable names that will be hidden before parameter's evaluation -
#1159 #1170 Changes in
GenericNodeTransformationAPI:- Now
implementationtakes additional parameter with final state value determined duringcontextTransformation DefinedLazyParameterandDefinedEagerParameterholdsexpression: TypedExpressioninstead ofreturnType: TypingResultDefinedLazyBranchParameterandDefinedEagerBranchParameterholdsexpressionByBranchId: Map[String, TypedExpression]instead ofreturnTypeByBranchId: Map[String, TypingResult]
- Now
-
- Now
SimpleSlidingAggregateTransformerV2andSlidingAggregateTransformeris deprecated in favour ofSlidingAggregateTransformerV2 - Now
SimpleTumblingAggregateTransformeris deprecated in favour ofTumblingAggregateTransformer - Now
SumAggregator,MaxAggregatorandMinAggregatordoesn't change type of aggregated value (previously was changed to Double) - Now
SumAggregator,MaxAggregatorandMinAggregatorreturn null instead of0D/Double.MaxValue/Double.MinValuefor case when there was no element added beforegetResult
- Now
-
#1149 FlinkProcessRegistrar refactor (can affect test code)
-
#1166
model.confshould be renamed todefaultModelConfig.conf -
#1218 FlinkProcessManager is no longer bundled in ui uber-jar. In docker/tgz distribution
-
#1255 Moved displaying
Metrics tabtocustomTabs -
#1257 Improvements: Flink test util package
- Added methods:
cancelJob,submitJob,listJobs,runningJobstoFlinkMiniClusterHolder - Deprecated:
runningJobs, fromMiniClusterExecutionEnvironment - Removed:
getClusterClientfromFlinkMiniClusterHolderinterface, because of flink compatibility at Flink 1.9 - Renamed:
FlinkStreamingProcessRegistrartoFlinkProcessManager
- Added methods:
-
#1303 TypedObjectTypingResult has a new field: additionalInfo
In version 0.2.0
-
#1104 Creation of
FlinkMiniClusteris now extracted fromStoppableExecutionEnvironment. You should create it using e.g.:val flinkMiniClusterHolder = FlinkMiniClusterHolder(FlinkTestConfiguration.configuration(parallelism))
flinkMiniClusterHolder.start()and then create environment using:
flinkMiniClusterHolder.createExecutionEnvironment(). At the end you should cleanup
flinkMiniClusterHolderby:flinkMiniClusterHolder.stop().
FlinkMiniClusterHoldershould be created once for test class - it is thread safe and resource expensive.MiniClusterExecutionEnvironmentin the other hand should be created for each process. It is not thread safe because underlyingStreamExecutionEnvironmentis not. You can useFlinkSpecto achieve that. -
pl.touk.nussknacker.engine.queryablestate.QueryableClientwas moved fromqueryableStatemodule topl.touk.nussknacker.engine.api.queryablestatepackage inapimodulepl.touk.nussknacker.engine.queryablestate.QueryableStatewas moved topl.touk.nussknacker.engine.api.queryablestate- CustomTransformers from
pl.touk.nussknacker.engine.flink.util.transformerinflinkUtilmodule were moved to newflinkModelUtilmodule. pl.touk.nussknacker.engine.testing.EmptyProcessConfigCreatorwas moved frominterpretermodule topl.touk.nussknacker.engine.util.processpackage inutilmodule
-
#1039 Generic parameter of
LazyParameter[T]has upper bound AnyRef now to avoid problems with bad type extraction. It caused changesAnytoAnyRefin a few places - mainlyFlinkLazyParameterFunctionHelperandFlinkCustomStreamTransformation -
#1039
FlinkStreamingProcessRegistrar.applyhas a new parameter of typeExecutionConfigPreparer. In production code you should passExecutionConfigPreparer.defaultChain()there and in test code you should passExecutionConfigPreparer.unOptimizedChain(). See scaladocs for more info. If you already have done some Flink'sExecutionConfigset up before you've registered process, you should consider create your own chain usingExecutionConfigPreparer.chain(). -
#1039
FlinkSourceFactorydoesn't takeTypeInformationtype class as a generic parameter now. Instead of this, it takesClassTag.TypeInformationis determined during source creation.typeInformation[T]method was moved fromBasicFlinkSourcetoFlinkSourcebecause still must be some place to determine it for tests purpose. -
#965 'aggregate' node in generic model was renamed to 'aggregate-sliding'
-
#922 HealthCheck API has new structure, naming and JSON responses:
- old
/healthCheckis moved to/healthCheck/process/deployment - old
/sanityCheckis moved to/healthCheck/process/validation - top level
/healthCheckindicates general "app-is-running" state
- old
-
#879 Metrics use variables by default, see docs to enable old mode, suitable for graphite protocol. To use old way of sending:
- put
globalParameters.useLegacyMetrics = truein each model configuration (to configure metrics sending in Flink) - put:
countsSettings {
user: ...
password: ...
influxUrl: ...
metricsConfig {
nodeCountMetric: "nodeCount.count"
sourceCountMetric: "source.count"
nodeIdTag: "action"
countField: "value"
}
} - put
-
Introduction to KafkaAvro API: #871, #881, #903, #981, #989, #998, #1007, #1014, #1034, #1041
API for KafkaAvroSourceFactory was changed:
KafkaAvroSourceFactory old way:
val clientFactory = new SchemaRegistryClientFactory
val source = new KafkaAvroSourceFactory(
new AvroDeserializationSchemaFactory[GenericData.Record](clientFactory, useSpecificAvroReader = false),
clientFactory,
None,
processObjectDependencies = processObjectDependencies
)
KafkaAvroSourceFactory new way :
val schemaRegistryProvider = ConfluentSchemaRegistryProvider(processObjectDependencies)
val source = new KafkaAvroSourceFactory(schemaRegistryProvider, processObjectDependencies, None)
Provided new API for Kafka Avro Sink:
val kafkaAvroSinkFactory = new KafkaAvroSinkFactory(schemaRegistryProvider, processObjectDependencies)
Additional changes:
- Bump up confluent package to 5.5.0
- (Refactor Kafka API) Moved
KafkaSourceFactorytopl.touk.nussknacker.engine.kafka.sinkpackage - (Refactor Kafka API) Changed
BaseKafkaSourceFactory, now it requiresdeserializationSchemaFactory: KafkaDeserializationSchemaFactory[T] - (Refactor Kafka API) Moved
KafkaSinkFactorytopl.touk.nussknacker.engine.kafka.sourcepackage - (Refactor Kafka API) Renamed
SerializationSchemaFactorytoKafkaSerializationSchemaFactory - (Refactor Kafka API) Renamed
DeserializationSchemaFactorytoKafkaDeserializationSchemaFactory - (Refactor Kafka API) Renamed
FixedDeserializationSchemaFactorytoFixedKafkaDeserializationSchemaFactory - (Refactor Kafka API) Renamed
FixedSerializationSchemaFactorytoFixedKafkaSerializationSchemaFactory - (Refactor Kafka API) Removed
KafkaSerializationSchemaFactoryBase - (Refactor Kafka API) Replaced
KafkaKeyValueSerializationSchemaFactoryBasebyKafkaAvroKeyValueSerializationSchemaFactory(it handles only avro case now) - (Refactor Kafka API) Removed
KafkaDeserializationSchemaFactoryBase - (Refactor Kafka API) Replaced
KafkaKeyValueDeserializationSchemaFactoryBasebyKafkaAvroKeyValueDeserializationSchemaFactory(it handles only avro case now) - (Refactor KafkaAvro API) Renamed
AvroDeserializationSchemaFactorytoConfluentKafkaAvroDeserializationSchemaFactoryand moved toavro.schemaregistry.confluentpackage - (Refactor KafkaAvro API) Renamed
AvroKeyValueDeserializationSchemaFactorytoConfluentKafkaAvroDeserializationSchemaFactoryand moved toavro.schemaregistry.confluentpackage - (Refactor KafkaAvro API) Renamed
AvroSerializationSchemaFactorytoConfluentAvroSerializationSchemaFactoryand moved toavro.schemaregistry.confluentpackage - (Refactor KafkaAvro API) Renamed
AvroKeyValueSerializationSchemaFactorytoConfluentAvroKeyValueSerializationSchemaFactoryand moved toavro.schemaregistry.confluentpackage - (Refactor KafkaAvro API) Removed
FixedKafkaAvroSourceFactoryandFixedKafkaAvroSinkFactory(now we don't support fixed schema) - (Refactor Kafka API) Replaced
topics: List[String]byList[PreparedKafkaTopic]and removedprocessObjectDependenciesinKafkaSource
Be aware that we are using Avro 1.9.2 instead of default Flink's 1.8.2 (for Java time logical types conversions purpose).
- #1013 Expression evaluation is synchronous now. It shouldn't cause any problems (all languages were synchronous anyway), but some internal code may have to change.
In version 0.1.2
- #957 Custom node
aggregatefromgenericmodel has changed parameter fromwindowLengthInSecondstowindowLengthwith human friendly duration input. If you have used it in process, you need to insert correct value again. - #954
TypedMapis not a case class wrapping scala Map anymore. If you have done some pattern matching on it, you should usecase typedMap: TypedMap => typedMap.asScalainstead.
In version 0.1.1
- #930
DeeplyCheckingExceptionExtractorwas moved fromnussknacker-flink-utilmodule tonussknacker-utilmodule. - #919
KafkaSourceconstructor now doesn't takeconsumerGroup. Instead of this it computesconsumerGroupon their own based onkafka.consumerGroupNamingStrategyinmodelConfig(default set toprocessId). You can also override it byoverriddenConsumerGroupoptional parameter. Regards to this changes,KafkaConfighas new, optional parameterconsumerGroupNamingStrategy. - #920
KafkaSourceconstructor now takesKafkaConfiginstead of using one that was parsed byBaseKafkaSourceFactory.kafkaConfig. Also if you parse Typesafe Config toKafkaSourceon your own, now you should use dedicated methodKafkaConfig.parseConfigto avoid further problems when parsing strategy will be changed. - #914
pl.touk.nussknacker.engine.api.definition.Parameterhas deprecated main factory method withruntimeClassparameter. Now should be passedisLazyParameterinstead. Also were removedruntimeClassfrom variances of factory methods prepared for easy testing (optionalmethod and so on).
In version 0.1.0
- #755 Default async execution context does not depend on parallelism.
asyncExecutionConfig.parallelismMultiplierhas been deprecated and should be replaced withasyncExecutionConfig.workers. 8 should be sane default value. - #722 Old way of configuring Flink and model (via
flinkConfigandprocessConfig) is removed.processTypesconfiguration should be used from now on. Example:becomes:flinkConfig {...}
processConfig {...}processTypes {
"type e.g. streaming" {
deploymentConfig {
type: "flinkStreaming"
PUT HERE PROPERTIES OF flinkConfig FROM OLD CONFIG
}
modelConfig {
classPath: PUT HERE VALUE OF flinkConfig.classPath FROM OLD CONFIG
PUT HERE PROPERTIES OF processConfig FROM OLD CONFIG
}
}
} - #763 Some API traits (ProcessManager, DictRegistry DictQueryService, CountsReporter) now extend
java.lang.AutoCloseable. - Old way of additional properties configuration should be replaced by the new one, which is now mapped to
Map[String, AdditionalPropertyConfig]. Example in your config:becomes:additionalFieldsConfig: {
mySelectProperty {
label: "Description"
type: "select"
isRequired: false
values: ["true", "false"]
}
}additionalPropertiesConfig {
mySelectProperty {
label: "Description"
defaultValue: "false"
editor: {
type: "FixedValuesParameterEditor",
possibleValues: [
{"label": "Yes", "expression": "true"},
{"label": "No", "expression": "false"}
]
}
}
} - #588 #882
FlinkSourceAPI changed, current implementation is nowBasicFlinkSource - #839 #882
FlinkSinkAPI changed, current implementation is nowBasicFlinkSink - #841
ProcessConfigCreatorAPI changed; note that currently all process objects are invoked withProcessObjectDependenciesas a parameter. The APIs ofKafkaSinkFactory,KafkaSourceFactory, and all their implementations were changed.Configis available as property ofProcessObjectDependenciesinstance. - #863
restUrlindeploymentConfigneed to be preceded with protocol. Host with port only is not allowed anymore. - Rename
grafanaSettingstometricsSettingsin configuration.
In version 0.0.12
- Upgrade to Flink 1.7
- Refactor of custom transformations, dictionaries, unions, please look at samples in example or generic to see API changes
- Considerable changes to authorization configuration, please look at sample config to see changes
- Circe is now used by default instead of Argonaut, but still can use Argonaut in Displayable
In version 0.0.11
- Changes in CustomStreamTransformer implementation, LazyInterpreter became LazyParameter, please look at samples to see changes in API
In version 0.0.8
- Upgrade to Flink 1.4
- Change of format of Flink cluster configuration
- Parameters of sources and sinks are expressions now - automatic update of DB is available
- Change of configuration of Grafana dashboards
- Custom processes are defined in main configuration file now