forked from proofpoint/platform
-
Notifications
You must be signed in to change notification settings - Fork 0
/
CHANGES
1842 lines (1232 loc) · 63.6 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 1.05
* Findbugs run by default
Findbugs is now hooked into the verify lifecycle phase. (The previous
attempt was missing a step.) Failing the build on Findbugs failures is
now disabled by default.
* Reporting
We added support for reporting string values to KairosDB. Reported values
that are not Number or Boolean have their toString() reported as a string.
* MaxDataSize and MinDataSize
We added MaxDataSize and MinDataSize Bean validations.
* HttpClient
We added a "http-client.max-requests-queued-per-destination" config option
(default 1024).
* Thread Factory
We have changed the thread factory implementations to capture the thread
context class loader during factory creation and set this class loader on
threads created by the factory.
* Smile mapper
We have added a JAX-RS mapper encoding responses using Smile. Smile is a
highly efficient binary encoding of JSON data. For more information on
Smile see: http://wiki.fasterxml.com/SmileFormatSpec
* Library upgrades
- joda-time to 2.4
- Jersey to 2.12
- Jetty to 9.2.2
- Jackson to 2.4.2
* Maven plugin upgrades
- findbugs-maven-plugin to 3.0.0
* [Bug] Don't unannounce from discovery if Announcer never started.
Platform 1.04
* RPM packaging
We added support to rest-server-base for packaging projects into RPMs.
This profile is activated on Linux by creating a file .build-rpm in
the root of the module or submodule. This file can be empty. The RPM
is attached as an additional artifact.
The username used to run the server defaults to ${project.artifactId}
and can be changed by setting the property ${project.rpm.username}.
The RPM will stop the server upon upgrade or removal and will refuse
to install if the server username does not exist.
* Maven 3.2.2 required
In order to support RPM packaging, we increased the minimum version of
Maven to 3.2.2.
* Library upgrades
- Guava to 17.0
* Maven plugin upgrades
- findbugs-maven-plugin to 2.5.2
- maven-release-plugin to 2.5
Platform 1.03
* JAX-RS 2
We have upgraded to Jersey 2.9.1 which implements the JAX-RS 2 specification.
Platform clients need to change the dependency:
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-core</artifactId>
to:
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
As part of this upgrade we have introduced an explicit binder for JAX-RS
resources. For example, the following registers the person JAX-RS resource:
JaxrsBinder.jaxrsBinder(binder).bind(PersonResource.class)
The new explicit binding code is backwards compatible with the "binding
scraping" code, so you do not need to immediately update your code. The new
JaxrsModule will print a warning for each resource that was not explicitly
bound, so it is easy to find update existing code. Once you have updated
everything, use JaxrsModule.explicitJaxrsModule() to prevent regressions.
In a future version we will remove the backwards compatibility, so please
update soon.
We have removed JaxrsBinder.bindResourceFilterFactory(). Users of this will
have to convert their ResouceFilterFactory implementations to JAX-RS 2
server filters.
Platform 1.02
* BalancingHttpClient
We added DiscoveryBinder.bindDiscoveredHttpClient(String) and
DiscoveryBinder.bindDiscoveredHttpClient(String, ServiceType) methods which
bind the HttpClient with the @ServiceType(type) annotation.
* Library updates
- jacoco to 0.7.1 (fixes failures when compiling with JDK 8)
Platform 1.01
* Change packaging to not include zip file dependencies
* Library updates
- jmxutils to 1.18
- findbugs-annotations to 2.0.3
* [Bug] Fix Discovery announcer client to handle zero announcements
* [Bug] Fix inadvertent masking of errors when detecting jmx agent
Platform 1.00
* HttpServer
We restored support for compressed request bodies. This had been removed in
the Jetty 9 upgrade in Platform 0.91.
* JsonCodec
We added JsonCodec.withoutPretty() which returns a JsonCodec that doesn't
add whitespace to the encoded JSON.
* Assertions
We added Assertions.assertNotContains() methods.
Platform 0.99
* HTTPClient
- We have disabled following HTTP redirects by default. Redirects may be
enabled per-request using Request.Builder.setFollowRedirects(true).
* HttpServiceSelector
HttpServiceSelector is now deprecated. Code using it should be rewritten
to use a BalancingHttpClient instead.
Platform 0.98
* JaCoCo replaces Cobertura
We replaced Cobertura with JaCoCo. JaCoCo is now run by default in projects
that use library or rest-server-base as a parent POM.
* TimeStat and SparseTimeStat
- TimeStat and SparseTimeStat now export a Total metric.
- We added a BlockTimer.timeTo() method for changing the stat object used
to record the time.
* BoundedExecutor
We added BoundedExecutor, which guarantees that no more than maxThreads will
be used to execute tasks.
Platform 0.97
* Events
- The event client now retries failed requests.
- The Future returned from EventClient.post() now fails with
UnexpectedResponseException when the collector service returns a failure
response code.
Platform 0.96
* JMX
- We no longer announce the "jmx" service to discovery.
- We no longer enable remote JMX by default. Remote JMX may be enabled with
the "jmx.enabled" config option.
* HttpClient
This release fixes a couple of performance issues and bugs in the HttpClient:
- The client was inadvertently requesting GZIP responses. We've disabled this
behavior since it affects CPU utilization.
- We've fixed an issue in the way the response buffers are managed that
affects performance due to unnecessary resizing.
- The maximum response size was hard-coded instead of using the existing
config option.
* Library upgrade
- Jetty to 9.1.4
Platform 0.95
* Reporting
- We changed some metric names:
- RequestStats.* renamed to HttpServer.*
- DetailedRequestStats.RequestTime.* renamed to HttpServer.RequestTimeByCode.*
- Failure.Count renamed to ServiceClient.Failure.Count
- ResponseTime.* renamed to ServiceClient.RequestTime.*
- We no longer report a MaxError metric from TimeStat and DistributionStat.
- We no longer include a "package" tag in reported metrics.
- We removed the HttpClient._BindingAnnotation_.Count metric as redundant.
* Stats
We have deprecated CounterStat.update(long), replacing it by CounterStat.add(long)
We created SparseCounterStat, etc. for use with report collections. These stats
objects do not report any metrics for minutes in which no data were added to the
object. They also do not export any attributes to JMX.
* Configuration
The @ConfigMap annotation is no longer necessary and is deprecated.
Platform 0.94
* The launcher now invokes the JVM with the following default switches:
-server
-XX:+UseConcMarkSweepGC
-XX:+ExplicitGCInvokesConcurrent
-XX:+HeapDumpOnOutOfMemoryError
-XX:+AggressiveOpts
-XX:+DoEscapeAnalysis
-XX:+UseCompressedOops
-XX:OnOutOfMemoryError=kill -9 %p
* We removed unnecessary features from the Rack launcher:
- The rack launcher no longer copies the etc directory to rack/config
- The rack config path is now always "rack/config.ru"
- The rack environment is now always "production"
Platform 0.93
* Reverted the Hamcrest support in JsonTester.assertJsonEncode()
* Library upgrade
- Jetty to 9.1.3
Platform 0.92
* We created TestingReportCollectionFactory
* JsonTester.assertJsonEncode() now supports Hamcrest matchers
Platform 0.91
* AsyncHttpClient collapsed into HttpClient
- We moved the executeAsync() method into the HttpClient interface.
- The AsyncHttpClient interface is now deprecated.
- The AsyncHttpClient.AsyncHttpResponseFuture interface is now named
HttpClient.HttpResponseFuture
* HttpClient uses Jetty
We replaced the Apache and Netty HttpClient implementations with
JettyHttpClient, a Jetty implementation.
* Configuration warnings are no longer sent to the event service upon startup.
* We added a Bootstrap.quiet() method to disable logging of configuration.
* We tightened the type bounds of Assertions.assertInstanceOf() to catch some
errors at compile time.
* Library upgrades
- Jetty to 9.1.2
- JRuby to 1.7.11
* Maven plugin upgrades
- maven-duplicate-finder-plugin 1.0.6
Platform 0.90
* JsonCodec
The JsonCodec.jsonCodec() factory method now uses Guava's TypeToken rather than
Guice's TypeLiteral. This backwards incompatible change allows using the json
module without a dependency on Guice.
* TestingHttpServer now supports resources
* Library upgrades
- Guava to 16.0.1
- logback to 1.1.1
- findbugs-annotations to 2.0.2
- testng to 6.8.7
Platform 0.89
* [Bug] BalancingHttpClient no longer dequotes and requotes the URI.
* [Bug] HttpUriBuilder now quotes the '+' character.
Platform 0.88
* Bootstrap and Logging
- Bootstrap now initializes logging before the withModules() call. Any
test code that needs to call doNotInitializeLogging() now must do
so before the withModules() call.
- We modified the archetype Main classes to place the Bootstrap call inside
the try block. This allows more startup exceptions to be logged. We
recommend applications make a corresponding change to their Main class.
* We removed the deprecated Bootstrap.strictConfig() and
ConfigurationFactory.getUsedProperties() methods.
* BalancingHttpClient now avoids concurrent calls to the same instance and
uses discovery changes that happen after the first attempt.
* [Bug] BalancingHttpClient instances couldn't be configured.
* [Bug] JAX-RS response time reporting threw exceptions when a resource class
had multiple methods with the same name.
* [Bug] The launcher wasn't disconnecting from the terminal upon server start.
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