/*
* Copyright 2015-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.glowroot.agent.plugin.jdbc.message;
import java.util.Collection;
import org.glowroot.agent.plugin.api.QueryMessage;
import org.glowroot.agent.plugin.api.QueryMessageSupplier;
public class BatchPreparedStatementMessageSupplier extends QueryMessageSupplier {
// default is 512k characters so that memory limit is 1mb since 1 character = 2 bytes
//
// this same property is used to define similar limit in org.glowroot.agent.plugin.api.Message
private static final int MESSAGE_CHAR_LIMIT =
Integer.getInteger("glowroot.message.char.limit", 512 * 1024);
private final Collection<BindParameterList> batchedParameters;
private final int batchSize;
public BatchPreparedStatementMessageSupplier(Collection<BindParameterList> batchedParameters,
int batchSize) {
this.batchedParameters = batchedParameters;
this.batchSize = batchSize;
}
@Override
public QueryMessage get() {
// not using size() since capturedBatchSize is ConcurrentLinkedQueue
int capturedBatchSize = 0;
String suffix;
if (batchedParameters.isEmpty()) {
suffix = "";
} else {
StringBuilder sb = new StringBuilder();
boolean exceededMessageCharLimit = false;
for (BindParameterList oneParameters : batchedParameters) {
PreparedStatementMessageSupplier.appendParameters(sb, oneParameters);
capturedBatchSize++;
if (sb.length() > MESSAGE_CHAR_LIMIT) {
sb.setLength(MESSAGE_CHAR_LIMIT);
sb.append(" [truncated to ");
sb.append(MESSAGE_CHAR_LIMIT);
sb.append(" characters]");
exceededMessageCharLimit = true;
break;
}
}
if (!exceededMessageCharLimit && batchSize > capturedBatchSize) {
sb.append(" ...");
}
suffix = sb.toString();
}
String prefix;
if (batchSize > 1) {
// print out number of batches to make it easy to identify
prefix = "jdbc execution: " + batchSize + " x ";
} else {
prefix = "jdbc execution: ";
}
return QueryMessage.create(prefix, suffix);
}
}