forked from proofpoint/platform
-
Notifications
You must be signed in to change notification settings - Fork 0
/
CHANGES
1501 lines (1015 loc) · 53.9 KB
/
CHANGES
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
Platform 0.87
* The node.pool configuration property now allows uppercase in pool names.
* Reporting
- JAX-RS now reports response times per resource method and response code.
JaxrsModule now depends on ReportingModule.
- Permute reported metric names as necessary to make them acceptable to KairosDB
Platform 0.86
* Reporting
- The reporting client now uses discovery. The "report.uri" configuration
property has been removed.
- Reporting is now enabled by default. It may be disabled with the
"reporting.enabled" configuration property.
- The "report.tags" configuration property has been renamed to
"reporting.tags".
Platform 0.85
* [Bug] BalancingHttpClient preserve the query part of the URI
Platform 0.84
* Reporting (experimental)
- The values of any "type" and "name" tags are used to prefix the metric
name.
- The http-client RequestStats are exposed to reporting.
* We added Threads.threadsNamed(String) and Threads.daemonThreadsNamed(String)
methods to simplify creating a ThreadFactory.
* We added decayed total to Distribution
* We added merge support to CounterStat and DecayCounter
* [Bug] Ignore IOException in Closeables.closeQuietly()
* Library upgrades
- validation-api to 1.1.0.Final
- logback to 1.0.13
Platform 0.83
* Application name
We've added a static factory for Bootstrap which takes the name of the
application server:
Bootstrap.bootstrapApplication("name-of-application")
.withModules(...)
The previous Bootstrap constructors are deprecated.
The application name can be obtained from NodeInfo.getApplication().
NodeModule and TestingNodeModule have a dependency on the newly created
ApplicationNameModule. This dependency is supplied by Bootstrap.
The application name is included in a tag named "application" in reported
metrics.
* HttpServiceBalancer metrics
HttpServiceBalancer now reports:
- client response times by success/failure and target URI
- failures by failure category and target URI
DiscoveryModule now has a dependency on ReportingModule.
* TestingTicker
TestingTicker now has public visibility in the testing package. It is an
implementation of Ticker that can be manually incremented.
* Library upgrades
- Guava to 15.0
Platform 0.82
* We added JaxrsBinder.bindResourceFilterFactory for adding custom
ResourceFilterFactory instances to the HTTP server.
* The HTTP server no longer sends HttpRequest events.
Platform 0.81
* We made JAX-RS resource methods Bean-validate arguments of List and Map.
* JMX agent
We've replaced the custom JMX agent in Platform by the one built into the
JVM. This change makes it possible to use the VisualGC plugin for VisualVM
when jstatd is also running in the same machine as the Platform-based
process.
As a result of this change, we've also removed the 'jmx.rmiserver.hostname'
configuration option in favor of Java's native configuration option
'java.rmi.server.hostname'.
* We demoted several legacy configuration properties to defunct. We renamed
'discovery.uri' to 'testing.discovery.uri' to make it obvious that it should
never be used in production.
* We added an experimental management wrapper for a thread pool executor.
* We added the ConfigurationAwareProvider interface to implementing custom
configuration providers.
* We added byte array methods for JsonCodec.
* We added 1,5,10, and 25 percentiles to Distribution and added manual
percentile specification to Distribution getPercentiles
Platform 0.80
* HttpServer reporting
We instrumented HttpServer to use the reporting module. HttpServerModule()
now depends on ReportingModule().
We added stats broken down by response code and removed a redundant
CounterStat.
* Units
We've made a backwards incompatible change to the Duration API to align with
the DataSize API. The new Duration code has many new features:
- Duration remembers the original unit, so parses and prints round trips.
- toMillis() returns a long so it is easier to use with normal Java APIs.
- roundTo(TimeUnit) return a long in the specified unit.
- convertToMostSuccinctTimeUnit() will select the TimeUnit to produce
the easiest to read value.
- timeUnitToString(TimeUnit) to get a clean short name for TimeUnits.
To update to the new api, you will need to:
toMillis() now returns a long instead of a double
- Use getValue(MILLISECONDS) for the old behavior.
toString() returns a string in the original units instead of millis
- Use toString(MILLISECONDS) for the old behavior.
convertTo(TimeUnit) has been deprecated and will have an incompatible
return value in the future.
- Use getValue(TimeUnit) for the old behavior.
- Use roundTo(TimeUnit) to get a long in the specified unit.
* We added constructors to TestingHttpClient allowing instances to send
checked exceptions.
* Reporting (experimental)
We made refinements to the experimental reporting module.
- We split ReportingModule in two: ReportingModule is needed in order to
instrument code and ReportingClientModule is needed to send the data to
the time series database.
- reportBinder.bindReportCollection() now requires an additional method call
to specify the base ObjectName to use in exporting. Either
.withGeneratedName() or as(String) can be used.
reportBinder.bindReportCollection(StoreStat.class).withGeneratedName();
* [Bug] Fixed typo breaking Bootstrap.withApplicationDefaults().
* [Bug] JsonTester now uses correctly configured codecs.
Platform 0.79
* HttpClient exception handling
We have redesigned exception handling in the HttpClient. In the new design,
the handle or handleException method of the Response handler should be called
once per execution. To make this change we had to make some backwards
incompatible changes.
The AsyncHttpClient.executeAsync method now returns a ListenableFuture instead
of a CheckedFuture. Any caller that was using the checkedGet() method of
CheckedFuture will need to change to get() and handle the exceptions or use
one of the helper methods in Guava Futures.
* Reporting (experimental)
We added an experimental API for reporting metrics into a KairosDB
time-series database. The API and its configuration options are subject
to change.
- Collecting data
The @Gauge annotation may be placed on a getter in order to cause the
attribute to be both reported into the database and exported to JMX. If
the attribute is not to be exported to JMX, the @Reported annotation may
be used instead. The getter must return a number or boolean.
@Nested and @Flatten also work for reporting.
CounterStat, DistributionStat, and TimeStat have been extended to support
reporting.
The newly created Bucketed abstract class may be extended in order to
implement custom stats objects that support reporting in time buckets.
- Exporting report objects
The ReportBinder.export() methods behave like ExportBinder.export() except
they cause the bound objects to be exported to both reporting and JMX.
The ReportExporter may be used to dynamically export and unexport objects
to just reporting.
- Report collections
The ReportBinder.bindReportCollection() method may be used to break down
metrics by one or more keys. For example:
public interface StoreStat
{
CounterStat added(@Key("size") int size,
@Key("successful") boolean isSuccessful);
};
reportBinder.bindReportCollection(StoreStat.class);
will bind an implementation of StoreStat. A call to added(10, false) will
return a CounterStat bound to both reporting and JMX with the name
"type=StoreStat,name=added,size=10,successful=false".
- Reporting client
ReportingModule enables reporting of collected data to the
time-series database. Configuration parameters are:
report.uri - The URI of the KairosDB database
report.tag - A table of additional tag/value pairs to include in all
reported data. For example, report.tag.foo=bar will include
the additional tag foo=bar
The sample server has been updated to support reporting.
* Library upgrades
- jmxutils to 1.14
* [Bug] Futures returned from TestingHttpClient.executeAsync() didn't invoke callbacks.
Platform 0.78
* Rack Packaging
- Removed generation of gemfile.jar in favour of using Bundler’s standalone.
- Changed tar generation to include specific files instead of by exclusion to prevent pulling in unnecessary
project files.
- Incorporated asset precompilation fix
- Deprecated use of the bundler maven plugin as it didn’t work correctly or log useful information when it
failed. May want to wrap the above changes in a plugin in the future (currently using command lines via Ant
plugin).
* Rack
- Added intiialization code to ensure Rails application correctly loads gems from the standalone gem bundle.
- Fixed an issue in ServletAdapter that assumed status code was always an integer and caused exceptions when
it was actually a string
- Fixed issue that prevented Rails apps from setting more than one cookie at a time.
- Re-implemented hack to override logging as a Railtie so it could be correctly scheduled in the application
initialization sequence. All Rails apps will now correctly log everything (including startup logging) to
launcher.log.
- Updated/added gems to the test resources to ensure unit tests run correctly (which accounts for most of the
file changes)
Platform 0.77
* HttpClient
- The signature of ResponseHandler.handleException() has changed to:
T handleException(Request request, Exception exception)
throws E;
This permits the method to return a default value.
- We added a new DefaultingJsonResponseHandler which returns a default
response upon any error.
* Discovery client service pool default
Service pools now default to the configured value of 'node.pool'.
* SerialScheduledExecutorService
We added SerialScheduledExecutorService to the testing module. It is a
test utility implementation of ScheduledExecutorService. See
https://github.com/markkent/serial-executor-service for more information.
* Stats
- MeterStat has been deprecated. DistributionStat should be used insead.
- TimerStat has been deprecated. The newly created TimeStat should be used
instead.
- The Http client and sever RequestStats have been changed to use
DistributionStat and TimeStat.
* TestingHttpServer now injects a TraceTokenManager, so trace tokens are
available to other injected modules.
* Library upgrades
- Netty to 3.6.6.Final
* Maven plugin upgrades
- build-helper-maven-plugin 1.8
- maven-assembly-plugin 2.4
* [Bug] Fixed discovery client's inability to refresh services
* [Bug] Fixed missing module in Rack server.
Platform 0.76
* [Bug] Fixed Guice error when binding AsyncHttpClients both normally and privately.
* [Bug] Fixed the Netty http client's handling of exceptions.
Platform 0.75
* Experimental modules
We removed the trailing "-experimental" from all artifact names.
Any APIs that are experimental should be annotated with @Beta instead.
* We moved the /v1/jmx/mbean resource to /admin/jmx/mbean on the admin port.
* We removed the jmx-http-rpc-experimental artifact and the JmxHttpRpcModule
it defined.
* We moved Announcer and ServiceAnnouncement into the
com.proofpoint.discovery.client.announce package.
* Discovery aware balancing HttpClient
We added a BalancingHttpClient implementation which takes relative URLs,
implements discovery lookup, and retries requests.
To use, bind to a discovery service type:
DiscoveryBinder.bindDiscoveredHttpClient("storage", StorageClient.class)
.withFilter(SomeFilter.class)
.withTracing();
The resulting HttpClient can be injected in the normal way:
@Inject
StorageUser(@StorageClient HttpClient httpClient)
The resulting HttpClient differs from a classic HttpClient in that it that
the Request URI must be relative:
httpClient.execute(prepareGet()
.setUri(URI.create("v1/content/foo"))
.build(),
new StorageResponseHandler());
The BalancingHttpClient will send the request to some base URI obtained from
the discovery service for the ServiceType that the HttpClient was bound to
and for the pool obtained from configuration. If there are no available
instances, it will throw a ServiceUnavailableException.
The BalancingHttpClient will retry the request, up to a configurable number
of total attempts, if the underlying HttpClient reports either an exception
through ResponseHandler.handleException() or a response with a status code
of 408, 500, 502, 503, or 504. The server can suppress retries by including
an "X-Proofpoint-Retry: no" header in its response.
The ResponseHandler given to the BalancingHttpClient will be called at most
once. The BalancingHttpClient won't retry if the caller's
ResponseHandler.handle() method throws an exception.
The Request and its BodyGenerator may be required to produce their contents
many times.
Alternatively, use DiscoveryBinder.bindDiscoveredAsyncHttpClient() to bind
an AsyncHttpClient.
* We removed support for JSONP and the HTML form of /v1/jmx/mbeans.
* We explicitly specified UTF-8 as the charset for configuration property
files.
* We renamed ConfigAssertions.assertDeprecatedEquivalence() to
assertLegacyEquivalence().
* We added TestingHttpClient to simplify testing.
* QuantileDigest
We made a number of improvements to QuantileDigest. QuantileDigests now support
negative values, can be serialized/deserialized and merged with other QuantileDigests.
Important: QuantileDigest is no longer thread-safe, so if you have code that relies
on this guarantee, you'll need to update it to provide thread-safety at that layer.
* We added a method to TimedStat to time a block using try-with-resources:
try (BlockTimer ignored = timedStat.time()) {
...
}
* We added an addDiscoveredService(String type, String pool, String uri)
method to InMemoryDiscoveryClient.
* We changed the discovery client to no longer prefer https instances over
http instances, but to only use https for any instance that supports both
schemes.
* We removed support for loading the service inventory over http or https.
* [Bug] Fixed handling of missing content type for JSON http responses.
* We deprecated ConfigAssertions.assertDefaults().
* We upgraded Jackson to 2.2.2 and disabled property mutator inference.
Platform 0.74
* The new launcher status command now reports a running instance of a server
started by the old launcher
Platform 0.73
* Applications can now use Bootstrap.withApplicationDefaults() to specify
default configuration values.
* Upon startup, the main thread will no longer wait for the initial discovery
announcement.
* Launcher fixes
- Many jvm.config files were depending on the old launcher's interpreting
spaces and other shell metacharacters. The launcher will now print an
error message and refuse to start if the jvm.config file contains spaces
or shell quotes, unless the jvm.config file contains the comment
"# allow spaces".
- The new launcher can now shut down a server started by the old launcher.
- [Bug] The new launcher can now more reliably find the installation directory.
* [Bug] Don't create javadoc on non-release builds.
* Maven plugin upgrades
- maven-resources-plugin 2.6
- maven-source-plugin 2.2.1
- maven-surefire-plugin 2.14
Platform 0.72
Temporarily allow event names to start with lowercase letters, etc.
Platform 0.71
* Log rotation changes
The HTTP request log is now uses the same log rotation semantics as the server
log. The request log rotation is configured using the new
"http-server.log.max-size" and "http-server.log.max-history" configuration
options. The old "http-server.log.retention-time" configuration option is
deprecated and does nothing.
The "log.max-size" configuration option takes a DataSize and replaces the
now-legacy "log.max-size-in-bytes" option.
* Launcher reimplemented in Java
The REST server launcher has been rewritten in Java. Changes include:
- Fixes numerous race conditions.
- Implements the force-reload command required by the specification the
launcher allegedly implements.
- Removes dependency on Ruby.
- The launcher waits for the server to finish initialization (return from
main method) and returns an error status code if initialization fails.
- The launcher will no longer hang if the server fails to stop.
* BETA: Bootstrap for testing
The Bootstrap class performs may initialization tasks for servers, but when
testing not all installation tasks are desired. Specifically, the Bootstrap
class loads configuration properties from a file specified using System
property. The new setConfigurationProperty and setConfigurationProperties
have been added to supply the properties directly. Another, problematic
task is logging initialization, which can now be disabled with the new
doNotInitializeLogging() method. For an example of a Bootstrap test see
com.proofpoint.platform.sample.TestServer.
* ValidationAssertions.assertValidates() now returns its argument.
* JsonTester
We created a JsonTester utility class for unit testing JSON encoders and
decoders. JsonTester.assertJsonEncode() asserts that a given object encodes
to an expected JSON strucure. JsonTester.decodeJson returns the result of
decoding a given JSON structure with a given codec. In either case, the
JSON structure is specified as an Object, which can be a String, an Integer,
a Double, a Boolean, null, a List of JSON structures, or a Map of String to
JSON structures.
See TestPersonWithSelf and TestPersonRepresentation in the sample server for
examples of how to use JsonTester.
* Configuration improvements
- The ConfigurationFactory(Map<String, String> properties) constructor
(typically used in unit tests) is now strict, requiring all supplied
properties to be used.
- Configuration bound inside private binders now works correctly.
* Removal of jax-rs classes from clients
We have replaced all uses of jax-rs classes in clients with classes from Guava
or new classes in the Platform http client. In particular, the HttpHeaders and
MediaType classes in jax-rs has been replaced with HttpHeaders and MediaType
in Guava, and the Status and CacheControl classes have been replaced with
HttpStatus and CacheControl in the Platform http-client. This reduces the size
of clients and avoids some packing problems with the latest jax-rs releases.
Any existing code can continue to use the jax-rs versions of these classes, but
jax-rs is no longer required.
* AsyncHttpClient fixes
- This release contains a number of fixes for the AsyncHttpClient and additional
changes to ease debugging of async requests. In some cases the ResponseHandler
would not be notified of errors with the handleException method, even though
the future returned from the executeAsync method would be notified of the
error. To help with debugging, the executeAsync method now returns an
AsyncHttpResponseFuture which has a new method getState that can be used to
determine the current state of the http request. This is helpful when requests
seem to get lost after execution. Finally, we have changed the Netty setup to
properly name the worker threads, so you can more easily find the http client
threads.
- AsyncHttpClient (Netty based) now shares I/O pools by default. To get a
private IO pool, use withPrivateIoThreadPool() when binding the client.
The pools running user code are still per-client.
- AsyncHttpClient.executeAsync() no longer throws E.
* Binding of HTTP static content
We added HttpServerBinder, which binds static resources to be served by the
http server.
* Temporarily allow the characters .:=,- in event names once again.
* Add "X-Content-Type-Options: nosniff" header to all json responses to prevent
broken browsers from rendering the json as html, which is a potential XSS
vulnerability
* Dependency changes
com.google.code.findbugs:jsr305 was replaced with
com.google.code.findbugs:annotations
The jsr305 jar contains only the JSR 305 annotations while the
annotations jar also contains additional, Findbugs specific
annotations.
org.eclipse.jetty.orbit:javax.servlet was replaced with
javax.servlet:javax.servlet-api
* Library upgrades
- Jetty 8.1.10
- Guava 14.0.1
- slf4j 1.7.5
- logback 1.0.11
- Jersey 1.17.1
- TestNG 6.8.1
* Internal library upgrades
- Mockito 1.9.5
- Hamcrest 1.3
- jcommander 1.30
- mysql-connector-java 5.1.24
- h2 1.3.171
- Apache httpclient 4.2.4
- Apache httpcore 4.2.4
* Maven plugin upgrades
- maven-compiler-plugin 3.0
- maven-deploy-plugin 2.7
- maven-duplicate-finder-plugin 1.0.4
- maven-enforcer-plugin 1.2
- maven-install-plugin 2.4
- maven-jar-plugin 2.4
- maven-javadoc-plugin 2.9
Platform 0.70
* Upgrade Jackson to 2.1.3
Jackson 1.x has been upgraded to 2.1.x. This requires substantial code and
dependency changes as all the artifacts are named differently and all the
classes are in different packages. The upgrade guide has more details:
http://wiki.fasterxml.com/JacksonUpgradeFrom19To20.
The Json module now also supports Jackson Modules (more details at
http://wiki.fasterxml.com/JacksonFeatureModules).
* True async http client
The AsyncHttpClient has been rewritten on top of Netty. As part of this
work, the AsyncHttpClient has been converted into an interface and the
main implementation is NettyAsyncHttpClient. Additionally, the execute
method has been renamed to executeAsync so the AsyncHttpClient can extend
HttpClient. The change is to simply replace:
asyncHttpClient.execute(request, responseHandler);
with:
asyncHttpClient.executeAsync(request, responseHandler)
The other main change is when using the HttpClientBinder. The bindAsyncHttpClient
method now binds both an AsyncHttpClient and a HttpClient, so if you were binding
both before, you will need to remove the call to bindHttpClient.
This API remains in BETA, and is subject to additional backwards incompatible
changes.
* Socks proxy support in http client
The new NettyAsyncHttpClient supports connecting to servers through a socks proxy.
This is particularly useful for accessing production servers. The easiest way
to use this feature is to establish a socks proxy using ssh, as follows:
ssh -N -D 1080 any.server.running.sshd
Then simply set the HttpClientConfig SocksProxy property either directly in code
or via the following config option:
myclient.http-client.socks-proxy = localhost:1080
* Pretty-printed JSON
The injected JsonCodecFactory and injected codecs no longer produce
pretty-printed JSON. The previous behavior was a bug. JsonCodecFactory
has a method to return a factory that produces pretty-print codecs.
* Trace token improvements
- The trace token (and other MDC items) is now included in the server log.
- The trace token is now included in events.
* Configuration improvements
- The error message that Configuration issues upon Bean validation failure
now identifies the attribute's configuration property, if any.
- Configuration warnings are now sent to the event service upon startup
and once a day thereafter.
* Disabled auto-detection of constructors and use of getters as setters in
Jackson.
* The HttpClient and AsyncHttpClients now implement Closeable and properly
shutdown when used as lifecycle objects. Calling close shuts down the
connection pool for the underlying Netty HTTP client.
* DataSize and Duration can now be serialized as json
* Library upgrades
- Upgrade jmxutils to 1.13
- Upgrade jruby to 1.7.3
* H2 improvements
- Improve validation of H2EmbeddedDataSource config
- Allow use of H2 without an init script
- Enable mvcc support for embedded H2
* Removed deprecated features
- Support for v1 events has been removed.
- The EquivalenceTester static check methods have been removed.
* [Bug] HTTPS servers are now announced in discovery using the hostname, not an IP address
* [Bug] Don't throw an exception from http request logger when wall clock time goes backwards.
Platform 0.69
* Library Upgrades
In this release we have upgraded the following dependencies:
- Guava 13.0.1
- jetty 8.1.8
- httpclient 4.2.2
- bval-jsr303 0.5
- joda-time 2.1
NOTE: Guava 13 removes transitivity of the JSR-305 artifact (commonly used for @Nullable).
If your project depended on this, you need to add the following to your project's pom.xml file:
<dependency>
<groupId>com.google.code.findbugs</groupId>
<artifactId>jsr305</artifactId>
</dependency>
* Mappable exception for JSON decoding errors
When there is a JSON decoding error, the JsonMapper.readFrom() method now throws newly defined
exceptions (instead of WebApplicationException). This allows them to be handled by an ExceptionMapper.
The newly defined exceptions are BeanValidationException and JsonMapperParsingException.
* Workaround for InetAddress.getLocalHost() throwing UnrecognizedHostException in Java 7u5 on MacOS
- The jmx module now gets the default value of the local IP address from the node module.
- The event-client module tries harder to get the local hostname
* We now detect some incorrect usage to EquivalenceTester.
To detect calls intended for EquivalenceTester<T>.addEquivalentGroup(Iterable<T>) that instead
call EquivalenceTester<Object>.addEquivalentGroup(T, T...), the latter method now prohibits calls
with a single argument that implements Iterable.
* Configuration classes, getters, setters, and default constructors no longer need to be public.
* @ConfigSecuritySensitive now redacts the configuration value in any generated error.
* [Bug] @ConfigMap attributes can now be tested by ConfigAssertions.assertFullMapping() and
ConfigAssertions.assertDeprecatedEquivalence()
* [Bug] Don't throw exception from StatsRecordingHandler if the system clock goes backwards.
* We have removed the Cassandra module
Platform 0.67
* No thread pool for CounterStat
We changed the CounterStat implementation to use forward decay, which eliminates
the need for a thread pool (and having to manage a thread pool).
* HttpUriBuilder a fluent api for HTTP URIs
Building HTTP URIs using java.net.URI is difficult and error prone, so we added
a simple fluent API for building up HTTP URIs. For example:
URI uri = uriBuilder()
.scheme("http")
.host("www.example.com")
.port(8081)
.replacePath("/a/b/c")
.replaceParameter("k", "1")
.build();
Additionally, the API can manipulate existing URIs:
URI uri = HttpUriBuilder.uriBuilderFrom(URI.create("http://www.example.com:8081/?a=apple&b=banana"))
.replaceParameter("a", "apricot")
.appendPath("a/b/c")
.build();
* Bind Jackson key serializers and deserializers in Guice
We've added the ability to bind Jackson key serializers and deserializers with
the JsonBinder.
* Configuration types can now use a fromString method for coercion
The configuration system will look for methods in the following order:
fromString(String);
valueOf(String);
<init>(String);
* Quantile Digest
We've introduced an implementation of Quantile Digests, a data structure for computing approximate
quantile statistics and histograms in sub-linear space with guaranteed error bounds, from the paper
"Medians and Beyond: New Aggregation Techniques for Sensor Networks". It supports
exponentially-decayed counts and can be used to query quantiles and histograms very efficiently.
* DistributionStat
We've deprecated MeterStat in favor of DistributionStat. This new implementation is based on
QuantileDigest and exposes statistically valid percentile metrics at various resolutions
(1/5/15-minute, all time). It's designed to be exported via jmxutil's @Managed annotations.
* @ConfigSecuritySensitive
We created the @ConfigSecuritySensitive annotation for configuration settings such as passwords.
When placed on a @Config setter, prevents the value of the setting from being logged upon startup.
* @ConfigMap
We added support for configuration maps. For example, given the setter:
@Config("setting")
@ConfigMap(key = Integer.class, value = Double.class)
public void setSetting(Map<Integer, Double> value)
the configuration settings:
setting.1=0.059
setting.5=2.543
will cause the setter to be called with ImmutableMap.of(1, 0.059, 5, 2.543).
The "key" and "value" arguments both default to String.class and can be any type that the configuration
system can coerce. Furthermore, the "value" argument can be any configuration class. For example,
given a EndpointConfig class with setters annotated with @Config("hostname") and @Config("port"):
@Config("endpoint")
@ConfigMap(EndpointConfig.class)
public void setFruit(Map<String, EndpointConfig> value)
the configuration settings:
endpoint.foo.hostname=foo.example.com
endpoint.foo.port=8080
endpoint.bar.hostname=bar.example.com
will cause the setter to be called with a map with two entries. One entry will have key "foo" and
value an EndpointConfig with host "foo.example.com" and port "8080". The other entry will have key
"bar" and value an EndpointConfig with host "bar.example.com" and a default port.
* Additional error checks in configuration
- All configuration properties read from a configuration file must be used--Bootstrap.strictConfig()
now does nothing and is deprecated.
- Duplicate configuration property keys in a given configuration file now cause an error.
- Specifying a given configuration setting multiple times (through legacy properties) is now an error,
even if all the properties use the same string value.
* We removed the restriction of entity bodies to PUT/POST requests that was added in Platform 0.65
* We deprecated unused configuration settings in HTTPEventClient
* We limited the stats to log dependency to test scope
Platform 0.66
* Java 7 is now required
Platform 0.65
* Improvements in unit tests and testing utilities
* Modifications to allow building on Windows
* Restrict entity bodies to PUT/POST requests in HttpClient
* [Bug] Throw correct exception from HttpClient
Platform 0.64
* Fix bug that prevented skeleton server from starting
* Enforce use of HttpClientBinder
The previous way of using HttpClient was to create a new instance of the
HttpClientModule or AsyncHttpClientModule for each client. The recent addition
of filter support added a binding API, HttpClientBinder. The use of this API
is now required. The modules cannot be used directly anymore. Here is an
example of how to use the binder:
httpClientBinder(binder).bindHttpClient("foo", FooClient.class)
.withFilter(FirstFilter.class)
.withFilter(SecondFilter.class);
Here is a simpler example to create a client for use with other platform
services. The client will pass the trace token when making requests:
httpClientBinder(binder).bindHttpClient("foo", FooClient.class).withTracing();
Platform 0.63
* Fix bug that prevented sample and skeleton servers from starting
Platform 0.62
* Removed all dependencies to Ning's Asynchronous HTTP client
Since http-client-experimental now replaces the usage of Ning's Asynchronous
HTTP client, we've removed all existing references to that package. Rest
servers that upgrade to 0.62 may need to include it as an explicit dependency
if they don't want to upgrade.
* Cleaned up dependency management
There is now a library project that contains a single parent dependencyManagement
section for all poms to inherit from. This now includes REST Server Base. This
ensures that all platform libraries are built with a single set of versions that
produce fully compatible dependency closures with the services that consume them.
* Multiple refactoring commits for readability
There were multiple refactoring efforts to enhance readability. Some classes that
moved include:
RequestBuilder -> Request.Builder
EchoServlet is a separate class now
MediaType is now available as a class in Guava 12
* Addition of request filter support to HttpClient
HttpClients may now bind in request filters, an example of such can be found by
following the code in com.proofpoint.http.client.TestHttpClientBinder. This
was added to support having the TraceToken added into outbound http client requests.
* Removal of deprecated JavaUrlHttpClient
* Removal of the experimental module, segmented into separate modules
At this time, we will no longer have a single experimental module, please be aware
of classes that have the @Beta annotation going forward. Such classes are subject
to backwards incompatible changes.
Platform 0.61
* Upgrade Platform and Rest Server Base pom to Guava 12.0
* Tests for keep alives with ApacheHttpClient
Platform 0.60
* Fixed bug that prevents Rack servers from announcing
Platform 0.59
* Hibernate validator replaced with direct dependency on Apache BVal
We replaced the indirect use of the Hibernate validator with a direct
dependency on Apache BVal. Consequently, the dependency was removed
from the dependencyManagement section of the rest-server-base POM and
should be removed from the POM of any servers or libraries as it is
no longer required by Platform.
* Fixed a bug preventing V1 Events from being able to be used with HttpRequestEvents
* Check for duplicate classes in the dependency closure during builds
Starting at 0.59, any rest-server-base dependent projects will have a build
step added that ensures there are no duplicates of classes or resources on
the classpath. Any duplicates will trigger a failure of the build and the
build output will include all the problematic classes or resources and which
packages they come from. Using the dependency:tree build goal can help with
finding these conflicts and resolving them.
* Add JsonEventSerializer for external use
JsonEventSerializer serializes a single event in v2 format using a JsonGenerator.
The existing JsonEventWriter is not easily consumed from external projects.
* Add support for Rack servers to be able to announce with Discovery
Starting with 0.59, the configuration property "rackserver.announcement" will
set the name for the rack server to announce to discovery. The remaining
configuration to announce with discovery is identical to rest-server-base
parented projects.
Platform 0.58
* Fixed bug that prevents Rack applications from starting
* As of release 0.55, the HttpServerModule has additional dependencies:
- HttpEventModule
- DiscoveryModule
- JsonModule
Platform 0.57
* Fixed bug that prevents ServiceInventory from refreshing periodically
Platform 0.56
* Fixed bug that causes HttpRequestEvents to not be published
Platform 0.55
* In this release we have upgraded the following dependencies
- Jackson 1.9.5
* HTTP request events
We now record an event for each HTTP request processed. The HTTP request logging and
new event system now properly support the X-FORWARDED-FOR and X-FORWARDED-PROTO headers.