/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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.apache.ignite.internal.processors.cache.query; import java.io.Externalizable; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; import org.apache.ignite.cache.query.QueryDetailMetrics; import org.apache.ignite.internal.util.typedef.internal.S; import org.apache.ignite.internal.util.typedef.internal.U; /** * Adapter for {@link QueryDetailMetrics}. */ public class GridCacheQueryDetailMetricsAdapter implements QueryDetailMetrics, Externalizable { /** */ private static final long serialVersionUID = 0L; /** Query type to track metrics. */ private GridCacheQueryType qryType; /** Textual query representation. */ private String qry; /** Cache name. */ private String cache; /** Number of executions. */ private int execs; /** Number of completions executions. */ private int completions; /** Number of failures. */ private int failures; /** Minimum time of execution. */ private long minTime = -1; /** Maximum time of execution. */ private long maxTime; /** Sum of execution time of completions time. */ private long totalTime; /** Sum of execution time of completions time. */ private long lastStartTime; /** Cached metrics group key.*/ private GridCacheQueryDetailMetricsKey key; /** * Required by {@link Externalizable}. */ public GridCacheQueryDetailMetricsAdapter() { // No-op. } /** * Constructor with metrics. * * @param qryType Query type. * @param qry Textual query representation. * @param cache Cache name where query was executed. * @param startTime Duration of queue execution. * @param duration Duration of queue execution. * @param failed {@code True} query executed unsuccessfully {@code false} otherwise. */ public GridCacheQueryDetailMetricsAdapter(GridCacheQueryType qryType, String qry, String cache, long startTime, long duration, boolean failed) { this.qryType = qryType; this.qry = qryType == GridCacheQueryType.SCAN && qry == null ? cache : qry; this.cache = cache; if (failed) { execs = 1; failures = 1; } else { execs = 1; completions = 1; totalTime = duration; minTime = duration; maxTime = duration; } lastStartTime = startTime; } /** * Copy constructor. * * @param qryType Query type. * @param qry Textual query representation. * @param cache Cache name where query was executed. */ public GridCacheQueryDetailMetricsAdapter(GridCacheQueryType qryType, String qry, String cache, int execs, int completions, int failures, long minTime, long maxTime, long totalTime, long lastStartTime, GridCacheQueryDetailMetricsKey key) { this.qryType = qryType; this.qry = qry; this.cache = cache; this.execs = execs; this.completions = completions; this.failures = failures; this.minTime = minTime; this.maxTime = maxTime; this.totalTime = totalTime; this.lastStartTime = lastStartTime; this.key = key; } /** * @return Metrics group key. */ public GridCacheQueryDetailMetricsKey key() { if (key == null) key = new GridCacheQueryDetailMetricsKey(qryType, qry); return key; } /** * Aggregate metrics. * * @param m Other metrics to take into account. * @return Aggregated metrics. */ public GridCacheQueryDetailMetricsAdapter aggregate(QueryDetailMetrics m) { return new GridCacheQueryDetailMetricsAdapter( qryType, qry, m.cache(), execs + m.executions(), completions + m.completions(), failures + m.failures(), minTime < 0 || minTime > m.minimumTime() ? m.minimumTime() : minTime, maxTime < m.maximumTime() ? m.maximumTime() : maxTime, totalTime + m.totalTime(), lastStartTime < m.lastStartTime() ? m.lastStartTime() : lastStartTime, key ); } /** {@inheritDoc} */ @Override public String queryType() { return qryType.name(); } /** {@inheritDoc} */ @Override public String query() { return qry; } /** {@inheritDoc} */ @Override public String cache() { return cache; } /** {@inheritDoc} */ @Override public int executions() { return execs; } /** {@inheritDoc} */ @Override public int completions() { return completions; } /** {@inheritDoc} */ @Override public int failures() { return failures; } /** {@inheritDoc} */ @Override public long minimumTime() { return minTime < 0 ? 0 : minTime; } /** {@inheritDoc} */ @Override public long maximumTime() { return maxTime; } /** {@inheritDoc} */ @Override public double averageTime() { double val = completions; return val > 0 ? totalTime / val : 0; } /** {@inheritDoc} */ @Override public long totalTime() { return totalTime; } /** {@inheritDoc} */ @Override public long lastStartTime() { return lastStartTime; } /** {@inheritDoc} */ @Override public void writeExternal(ObjectOutput out) throws IOException { U.writeEnum(out, qryType); U.writeString(out, qry); U.writeString(out, cache); out.writeInt(execs); out.writeInt(completions); out.writeLong(minTime); out.writeLong(maxTime); out.writeLong(totalTime); out.writeLong(lastStartTime); } /** {@inheritDoc} */ @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { qryType = GridCacheQueryType.fromOrdinal(in.readByte()); qry = U.readString(in); cache = U.readString(in); execs = in.readInt(); completions = in.readInt(); minTime = in.readLong(); maxTime = in.readLong(); totalTime = in.readLong(); lastStartTime = in.readLong(); } /** {@inheritDoc} */ @Override public String toString() { return S.toString(GridCacheQueryDetailMetricsAdapter.class, this); } }