For some operations we have metrics that record how long the operation
took. For these operations we already record the execution time in the
trace.
However sometimes it is useful to record the execution time of an
operation in a trace without having a metric for this operation. This
change adds support for recording execution times of operations in a
trace without having a metric for it.
E.g.
  try (TraceTimer traceTimer =
          TraceContext.newTimer("do foo for user %s", user)) {
    // do foo
  }
adds the following entry to the trace:
  do foo for user jdoe took 20ms
If tracing is not enabled this is a no-op.
To demonstrate the new functionality this change records the times the
indexing takes if tracing is enabled.
Change-Id: Iddf4fd78ddfb96965802f95535a264a9c8f8a2ea
Signed-off-by: Edwin Kempin <ekempin@google.com>
		
	
		
			
				
	
	
		
			129 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			129 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
// Copyright (C) 2017 The Android Open Source Project
 | 
						|
//
 | 
						|
// 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 com.google.gerrit.server.index.group;
 | 
						|
 | 
						|
import com.google.common.collect.ImmutableSet;
 | 
						|
import com.google.common.flogger.FluentLogger;
 | 
						|
import com.google.gerrit.common.Nullable;
 | 
						|
import com.google.gerrit.extensions.events.GroupIndexedListener;
 | 
						|
import com.google.gerrit.extensions.registration.DynamicSet;
 | 
						|
import com.google.gerrit.index.Index;
 | 
						|
import com.google.gerrit.reviewdb.client.AccountGroup;
 | 
						|
import com.google.gerrit.server.account.GroupCache;
 | 
						|
import com.google.gerrit.server.group.InternalGroup;
 | 
						|
import com.google.gerrit.server.logging.TraceContext;
 | 
						|
import com.google.gerrit.server.logging.TraceContext.TraceTimer;
 | 
						|
import com.google.inject.assistedinject.Assisted;
 | 
						|
import com.google.inject.assistedinject.AssistedInject;
 | 
						|
import java.io.IOException;
 | 
						|
import java.util.Collection;
 | 
						|
import java.util.Collections;
 | 
						|
import java.util.Optional;
 | 
						|
 | 
						|
public class GroupIndexerImpl implements GroupIndexer {
 | 
						|
  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 | 
						|
 | 
						|
  public interface Factory {
 | 
						|
    GroupIndexerImpl create(GroupIndexCollection indexes);
 | 
						|
 | 
						|
    GroupIndexerImpl create(@Nullable GroupIndex index);
 | 
						|
  }
 | 
						|
 | 
						|
  private final GroupCache groupCache;
 | 
						|
  private final DynamicSet<GroupIndexedListener> indexedListener;
 | 
						|
  private final StalenessChecker stalenessChecker;
 | 
						|
  @Nullable private final GroupIndexCollection indexes;
 | 
						|
  @Nullable private final GroupIndex index;
 | 
						|
 | 
						|
  @AssistedInject
 | 
						|
  GroupIndexerImpl(
 | 
						|
      GroupCache groupCache,
 | 
						|
      DynamicSet<GroupIndexedListener> indexedListener,
 | 
						|
      StalenessChecker stalenessChecker,
 | 
						|
      @Assisted GroupIndexCollection indexes) {
 | 
						|
    this.groupCache = groupCache;
 | 
						|
    this.indexedListener = indexedListener;
 | 
						|
    this.stalenessChecker = stalenessChecker;
 | 
						|
    this.indexes = indexes;
 | 
						|
    this.index = null;
 | 
						|
  }
 | 
						|
 | 
						|
  @AssistedInject
 | 
						|
  GroupIndexerImpl(
 | 
						|
      GroupCache groupCache,
 | 
						|
      DynamicSet<GroupIndexedListener> indexedListener,
 | 
						|
      StalenessChecker stalenessChecker,
 | 
						|
      @Assisted @Nullable GroupIndex index) {
 | 
						|
    this.groupCache = groupCache;
 | 
						|
    this.indexedListener = indexedListener;
 | 
						|
    this.stalenessChecker = stalenessChecker;
 | 
						|
    this.indexes = null;
 | 
						|
    this.index = index;
 | 
						|
  }
 | 
						|
 | 
						|
  @Override
 | 
						|
  public void index(AccountGroup.UUID uuid) throws IOException {
 | 
						|
    // Evict the cache to get an up-to-date value for sure.
 | 
						|
    groupCache.evict(uuid);
 | 
						|
    Optional<InternalGroup> internalGroup = groupCache.get(uuid);
 | 
						|
 | 
						|
    if (internalGroup.isPresent()) {
 | 
						|
      logger.atInfo().log("Replace group %s in index", uuid.get());
 | 
						|
    } else {
 | 
						|
      logger.atInfo().log("Delete group %s from index", uuid.get());
 | 
						|
    }
 | 
						|
 | 
						|
    for (Index<AccountGroup.UUID, InternalGroup> i : getWriteIndexes()) {
 | 
						|
      if (internalGroup.isPresent()) {
 | 
						|
        try (TraceTimer traceTimer =
 | 
						|
            TraceContext.newTimer(
 | 
						|
                "Replacing group %s in index version %d", uuid.get(), i.getSchema().getVersion())) {
 | 
						|
          i.replace(internalGroup.get());
 | 
						|
        }
 | 
						|
      } else {
 | 
						|
        try (TraceTimer traceTimer =
 | 
						|
            TraceContext.newTimer(
 | 
						|
                "Deleting group %s in index version %d", uuid.get(), i.getSchema().getVersion())) {
 | 
						|
          i.delete(uuid);
 | 
						|
        }
 | 
						|
      }
 | 
						|
    }
 | 
						|
    fireGroupIndexedEvent(uuid.get());
 | 
						|
  }
 | 
						|
 | 
						|
  @Override
 | 
						|
  public boolean reindexIfStale(AccountGroup.UUID uuid) throws IOException {
 | 
						|
    if (stalenessChecker.isStale(uuid)) {
 | 
						|
      index(uuid);
 | 
						|
      return true;
 | 
						|
    }
 | 
						|
    return false;
 | 
						|
  }
 | 
						|
 | 
						|
  private void fireGroupIndexedEvent(String uuid) {
 | 
						|
    for (GroupIndexedListener listener : indexedListener) {
 | 
						|
      listener.onGroupIndexed(uuid);
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  private Collection<GroupIndex> getWriteIndexes() {
 | 
						|
    if (indexes != null) {
 | 
						|
      return indexes.getWriteIndexes();
 | 
						|
    }
 | 
						|
 | 
						|
    return index != null ? Collections.singleton(index) : ImmutableSet.of();
 | 
						|
  }
 | 
						|
}
 |