2323import io .sentry .Sentry ;
2424import java .util .EnumSet ;
2525import javax .servlet .DispatcherType ;
26- import javax .sql .DataSource ;
2726import lombok .NonNull ;
2827import lombok .extern .slf4j .Slf4j ;
2928import marquez .api .filter .JobRedirectFilter ;
3029import marquez .cli .DbMigrationCommand ;
30+ import marquez .cli .DbRetentionCommand ;
3131import marquez .cli .MetadataCommand ;
3232import marquez .cli .SeedCommand ;
3333import marquez .common .Utils ;
3434import marquez .db .DbMigration ;
35+ import marquez .jobs .DbRetentionJob ;
3536import marquez .logging .LoggingMdcFilter ;
3637import marquez .tracing .SentryConfig ;
3738import marquez .tracing .TracingContainerResponseFilter ;
@@ -79,6 +80,7 @@ public void initialize(@NonNull Bootstrap<MarquezConfig> bootstrap) {
7980 new EnvironmentVariableSubstitutor (ERROR_ON_UNDEFINED )));
8081
8182 // Add CLI commands
83+ bootstrap .addCommand (new DbRetentionCommand ());
8284 bootstrap .addCommand (new MetadataCommand ());
8385 bootstrap .addCommand (new SeedCommand ());
8486
@@ -97,7 +99,7 @@ public void initialize(@NonNull Bootstrap<MarquezConfig> bootstrap) {
9799 @ Override
98100 public void run (@ NonNull MarquezConfig config , @ NonNull Environment env ) {
99101 final DataSourceFactory sourceFactory = config .getDataSourceFactory ();
100- final DataSource source = sourceFactory .build (env .metrics (), DB_SOURCE_NAME );
102+ final ManagedDataSource source = sourceFactory .build (env .metrics (), DB_SOURCE_NAME );
101103
102104 log .info ("Running startup actions..." );
103105
@@ -124,17 +126,51 @@ public void run(@NonNull MarquezConfig config, @NonNull Environment env) {
124126 env .jersey ().register (new TracingContainerResponseFilter ());
125127 }
126128
127- MarquezContext marquezContext = buildMarquezContext (config , env , (ManagedDataSource ) source );
129+ final Jdbi jdbi = newJdbi (config , env , source );
130+ final MarquezContext marquezContext =
131+ MarquezContext .builder ().jdbi (jdbi ).tags (config .getTags ()).build ();
132+
128133 registerResources (config , env , marquezContext );
129134 registerServlets (env );
130135 registerFilters (env , marquezContext );
136+
137+ // Add scheduled jobs to lifecycle.
138+ if (config .hasDbRetentionPolicy ()) {
139+ // Add job to apply retention policy to database.
140+ env .lifecycle ()
141+ .manage (
142+ new DbRetentionJob (
143+ jdbi ,
144+ config .getDbRetention ().getFrequencyMins (),
145+ config .getDbRetention ().getNumberOfRowsPerBatch (),
146+ config .getDbRetention ().getRetentionDays ()));
147+ }
131148 }
132149
133150 private boolean isSentryEnabled (MarquezConfig config ) {
134151 return config .getSentry () != null
135152 && !config .getSentry ().getDsn ().equals (SentryConfig .DEFAULT_DSN );
136153 }
137154
155+ /** Returns a new {@link Jdbi} object. */
156+ private Jdbi newJdbi (
157+ @ NonNull MarquezConfig config , @ NonNull Environment env , @ NonNull ManagedDataSource source ) {
158+ final JdbiFactory factory = new JdbiFactory ();
159+ final Jdbi jdbi =
160+ factory
161+ .build (env , config .getDataSourceFactory (), source , DB_POSTGRES )
162+ .installPlugin (new SqlObjectPlugin ())
163+ .installPlugin (new PostgresPlugin ())
164+ .installPlugin (new Jackson2Plugin ());
165+ SqlLogger sqlLogger = new InstrumentedSqlLogger (env .metrics ());
166+ if (isSentryEnabled (config )) {
167+ sqlLogger = new TracingSQLLogger (sqlLogger );
168+ }
169+ jdbi .setSqlLogger (sqlLogger );
170+ jdbi .getConfig (Jackson2Config .class ).setMapper (Utils .getMapper ());
171+ return jdbi ;
172+ }
173+
138174 public void registerResources (
139175 @ NonNull MarquezConfig config , @ NonNull Environment env , MarquezContext context ) {
140176
@@ -156,27 +192,6 @@ protected void addDefaultCommands(Bootstrap<MarquezConfig> bootstrap) {
156192 super .addDefaultCommands (bootstrap );
157193 }
158194
159- private MarquezContext buildMarquezContext (
160- MarquezConfig config , Environment env , ManagedDataSource source ) {
161- final JdbiFactory factory = new JdbiFactory ();
162- final Jdbi jdbi =
163- factory
164- .build (env , config .getDataSourceFactory (), source , DB_POSTGRES )
165- .installPlugin (new SqlObjectPlugin ())
166- .installPlugin (new PostgresPlugin ())
167- .installPlugin (new Jackson2Plugin ());
168- SqlLogger sqlLogger = new InstrumentedSqlLogger (env .metrics ());
169- if (isSentryEnabled (config )) {
170- sqlLogger = new TracingSQLLogger (sqlLogger );
171- }
172- jdbi .setSqlLogger (sqlLogger );
173- jdbi .getConfig (Jackson2Config .class ).setMapper (Utils .getMapper ());
174-
175- final MarquezContext context =
176- MarquezContext .builder ().jdbi (jdbi ).tags (config .getTags ()).build ();
177- return context ;
178- }
179-
180195 private void registerServlets (@ NonNull Environment env ) {
181196 log .debug ("Registering servlets..." );
182197
0 commit comments