|
8 | 8 | import java.util.Arrays; |
9 | 9 | import java.util.Collections; |
10 | 10 | import java.util.List; |
| 11 | +import java.util.Set; |
11 | 12 | import java.util.UUID; |
12 | 13 | import org.apache.jmeter.reporters.ResultCollector; |
13 | 14 | import org.apache.jmeter.samplers.SampleSaveConfiguration; |
|
16 | 17 | import org.apache.jmeter.visualizers.SimpleDataWriter; |
17 | 18 | import us.abstracta.jmeter.javadsl.codegeneration.MethodCall; |
18 | 19 | import us.abstracta.jmeter.javadsl.codegeneration.MethodCallContext; |
| 20 | +import us.abstracta.jmeter.javadsl.codegeneration.MethodParam; |
19 | 21 | import us.abstracta.jmeter.javadsl.codegeneration.SingleTestElementCallBuilder; |
20 | 22 | import us.abstracta.jmeter.javadsl.codegeneration.TestElementParamBuilder; |
21 | 23 | import us.abstracta.jmeter.javadsl.codegeneration.params.BoolParam; |
|
42 | 44 | public class JtlWriter extends BaseListener { |
43 | 45 |
|
44 | 46 | protected String jtlFile; |
| 47 | + protected SampleStatus logOnly; |
45 | 48 | protected boolean saveAsXml; |
46 | 49 | protected boolean saveElapsedTime = true; |
47 | 50 | protected boolean saveResponseMessage = true; |
@@ -87,43 +90,24 @@ private static String buildFileName() { |
87 | 90 | return timeFormatter.format(Instant.now()) + " " + UUID.randomUUID() + ".jtl"; |
88 | 91 | } |
89 | 92 |
|
90 | | - @Override |
91 | | - public TestElement buildTestElement() { |
92 | | - ResultCollector logger = new ResultCollector(); |
93 | | - logger.setFilename(jtlFile); |
94 | | - SampleSaveConfiguration config = logger.getSaveConfig(); |
95 | | - config.setAsXml(saveAsXml); |
96 | | - config.setTime(saveElapsedTime); |
97 | | - config.setMessage(saveResponseMessage); |
98 | | - config.setSuccess(saveSuccess); |
99 | | - config.setSentBytes(saveSentByteCount); |
100 | | - config.setFileName(saveResponseFilename); |
101 | | - config.setEncoding(saveEncoding); |
102 | | - config.setIdleTime(saveIdleTime); |
103 | | - config.setResponseHeaders(saveResponseHeaders); |
104 | | - config.setAssertions(saveAssertionResults); |
105 | | - config.setFieldNames(saveFieldNames); |
106 | | - config.setLabel(saveLabel); |
107 | | - config.setThreadName(saveThreadName); |
108 | | - config.setAssertionResultsFailureMessage(saveAssertionFailureMessage); |
109 | | - config.setThreadCounts(saveActiveThreadCounts); |
110 | | - config.setLatency(saveLatency); |
111 | | - config.setSampleCount(saveSampleAndErrorCounts); |
112 | | - config.setRequestHeaders(saveRequestHeaders); |
113 | | - config.setResponseData(saveResponseData); |
114 | | - config.setTimestamp(saveTimeStamp); |
115 | | - config.setCode(saveResponseCode); |
116 | | - config.setDataType(saveDataType); |
117 | | - config.setBytes(saveReceivedByteCount); |
118 | | - config.setUrl(saveUrl); |
119 | | - config.setConnectTime(saveConnectTime); |
120 | | - config.setHostname(saveHostname); |
121 | | - config.setSamplerData(saveSamplerData); |
122 | | - config.setSubresults(saveSubResults); |
123 | | - if (!sampleVariables.isEmpty()) { |
124 | | - JMeterUtils.setProperty("sample_variables", String.join(",", sampleVariables)); |
125 | | - } |
126 | | - return logger; |
| 93 | + /** |
| 94 | + * Allows filtering which sample results to log according to their status. |
| 95 | + * <p> |
| 96 | + * This is useful, for example, when you want to have a jtl file with basic information for |
| 97 | + * success sample results, but a more detailed jtl file for the ones that fail. |
| 98 | + * |
| 99 | + * @param status specifies the status of the sample results to log. When set to null it will log |
| 100 | + * all sample results. By default, it is set to null. |
| 101 | + * @return the JtlWriter for further configuration or usage. |
| 102 | + * @since 1.4 |
| 103 | + */ |
| 104 | + public JtlWriter logOnly(SampleStatus status) { |
| 105 | + this.logOnly = status; |
| 106 | + return this; |
| 107 | + } |
| 108 | + |
| 109 | + public enum SampleStatus { |
| 110 | + SUCCESS, ERROR |
127 | 111 | } |
128 | 112 |
|
129 | 113 | /** |
@@ -665,6 +649,49 @@ public JtlWriter withVariables(String... variables) { |
665 | 649 | return this; |
666 | 650 | } |
667 | 651 |
|
| 652 | + @Override |
| 653 | + public TestElement buildTestElement() { |
| 654 | + ResultCollector logger = new ResultCollector(); |
| 655 | + logger.setFilename(jtlFile); |
| 656 | + if (logOnly != null) { |
| 657 | + logger.setSuccessOnlyLogging(logOnly == SampleStatus.SUCCESS); |
| 658 | + logger.setErrorLogging(logOnly == SampleStatus.ERROR); |
| 659 | + } |
| 660 | + SampleSaveConfiguration config = logger.getSaveConfig(); |
| 661 | + config.setAsXml(saveAsXml); |
| 662 | + config.setTime(saveElapsedTime); |
| 663 | + config.setMessage(saveResponseMessage); |
| 664 | + config.setSuccess(saveSuccess); |
| 665 | + config.setSentBytes(saveSentByteCount); |
| 666 | + config.setFileName(saveResponseFilename); |
| 667 | + config.setEncoding(saveEncoding); |
| 668 | + config.setIdleTime(saveIdleTime); |
| 669 | + config.setResponseHeaders(saveResponseHeaders); |
| 670 | + config.setAssertions(saveAssertionResults); |
| 671 | + config.setFieldNames(saveFieldNames); |
| 672 | + config.setLabel(saveLabel); |
| 673 | + config.setThreadName(saveThreadName); |
| 674 | + config.setAssertionResultsFailureMessage(saveAssertionFailureMessage); |
| 675 | + config.setThreadCounts(saveActiveThreadCounts); |
| 676 | + config.setLatency(saveLatency); |
| 677 | + config.setSampleCount(saveSampleAndErrorCounts); |
| 678 | + config.setRequestHeaders(saveRequestHeaders); |
| 679 | + config.setResponseData(saveResponseData); |
| 680 | + config.setTimestamp(saveTimeStamp); |
| 681 | + config.setCode(saveResponseCode); |
| 682 | + config.setDataType(saveDataType); |
| 683 | + config.setBytes(saveReceivedByteCount); |
| 684 | + config.setUrl(saveUrl); |
| 685 | + config.setConnectTime(saveConnectTime); |
| 686 | + config.setHostname(saveHostname); |
| 687 | + config.setSamplerData(saveSamplerData); |
| 688 | + config.setSubresults(saveSubResults); |
| 689 | + if (!sampleVariables.isEmpty()) { |
| 690 | + JMeterUtils.setProperty("sample_variables", String.join(",", sampleVariables)); |
| 691 | + } |
| 692 | + return logger; |
| 693 | + } |
| 694 | + |
668 | 695 | public static class CodeBuilder extends SingleTestElementCallBuilder<ResultCollector> { |
669 | 696 |
|
670 | 697 | public CodeBuilder(List<Method> builderMethods) { |
@@ -695,6 +722,7 @@ protected MethodCall buildMethodCall(ResultCollector collector, MethodCallContex |
695 | 722 | if (isAllSet(config)) { |
696 | 723 | return ret.chain("withAllFields", new BoolParam(true, false)); |
697 | 724 | } |
| 725 | + ret.chain("logOnly", SampleStatusParam.fromParamBuilder(paramBuilder)); |
698 | 726 | return ret.chain("saveAsXml", new BoolParam(config.saveAsXml(), false)) |
699 | 727 | .chain("withElapsedTime", new BoolParam(config.saveTime(), true)) |
700 | 728 | .chain("withResponseMessage", new BoolParam(config.saveMessage(), true)) |
@@ -741,4 +769,45 @@ private boolean isAllSet(SampleSaveConfiguration config) { |
741 | 769 |
|
742 | 770 | } |
743 | 771 |
|
| 772 | + private static class SampleStatusParam extends MethodParam { |
| 773 | + |
| 774 | + private final SampleStatus sampleStatus; |
| 775 | + |
| 776 | + private SampleStatusParam(SampleStatus sampleStatus) { |
| 777 | + super(SampleStatus.class, null); |
| 778 | + this.sampleStatus = sampleStatus; |
| 779 | + } |
| 780 | + |
| 781 | + public static MethodParam fromParamBuilder(TestElementParamBuilder paramBuilder) { |
| 782 | + SampleStatus status = null; |
| 783 | + MethodParam successOnly = paramBuilder.boolParam( |
| 784 | + "ResultCollector.success_only_logging", false); |
| 785 | + if (!successOnly.isDefault()) { |
| 786 | + status = SampleStatus.SUCCESS; |
| 787 | + } else { |
| 788 | + MethodParam errorOnly = paramBuilder.boolParam("ResultCollector.error_logging", false); |
| 789 | + if (!errorOnly.isDefault()) { |
| 790 | + status = SampleStatus.ERROR; |
| 791 | + } |
| 792 | + } |
| 793 | + return new SampleStatusParam(status); |
| 794 | + } |
| 795 | + |
| 796 | + @Override |
| 797 | + public boolean isDefault() { |
| 798 | + return sampleStatus == null; |
| 799 | + } |
| 800 | + |
| 801 | + @Override |
| 802 | + public Set<String> getImports() { |
| 803 | + return Collections.singleton(SampleStatus.class.getName()); |
| 804 | + } |
| 805 | + |
| 806 | + @Override |
| 807 | + protected String buildCode(String indent) { |
| 808 | + return SampleStatus.class.getSimpleName() + "." + sampleStatus.name(); |
| 809 | + } |
| 810 | + |
| 811 | + } |
| 812 | + |
744 | 813 | } |
0 commit comments