Skip to content

Commit

Permalink
Prism monitoring (object clone operations). Refactoring: internals co…
Browse files Browse the repository at this point in the history
…nfig and monitor are in schema component now.
  • Loading branch information
semancik committed Sep 26, 2016
1 parent ffde69d commit 7d5b7be
Show file tree
Hide file tree
Showing 68 changed files with 1,197 additions and 80 deletions.
Expand Up @@ -16,7 +16,6 @@

package com.evolveum.midpoint.web.component.prism;

import com.evolveum.midpoint.common.InternalsConfig;
import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition;
import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
Expand All @@ -26,6 +25,7 @@
import com.evolveum.midpoint.prism.polystring.PolyString;
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.schema.internals.InternalsConfig;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.util.ResourceTypeUtil;
import com.evolveum.midpoint.util.DebugDumpable;
Expand Down
Expand Up @@ -17,8 +17,8 @@
package com.evolveum.midpoint.web.page.admin.configuration;

import com.evolveum.midpoint.common.Clock;
import com.evolveum.midpoint.common.InternalsConfig;
import com.evolveum.midpoint.gui.api.model.LoadableModel;
import com.evolveum.midpoint.schema.internals.InternalsConfig;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.security.api.AuthorizationConstants;
import com.evolveum.midpoint.util.DebugUtil;
Expand Down
Expand Up @@ -16,7 +16,7 @@

package com.evolveum.midpoint.web.page.admin.configuration.dto;

import com.evolveum.midpoint.common.InternalsConfig;
import com.evolveum.midpoint.schema.internals.InternalsConfig;
import com.evolveum.midpoint.util.DebugUtil;
import com.evolveum.midpoint.util.QNameUtil;

Expand Down
Expand Up @@ -27,12 +27,12 @@
import org.testng.AssertJUnit;
import org.testng.annotations.Test;

import com.evolveum.midpoint.common.InternalsConfig;
import com.evolveum.midpoint.common.LoggingConfigurationManager;
import com.evolveum.midpoint.init.InfraInitialSetup;
import com.evolveum.midpoint.init.InitialDataImport;
import com.evolveum.midpoint.init.ModelInitialSetup;
import com.evolveum.midpoint.model.test.AbstractModelIntegrationTest;
import com.evolveum.midpoint.schema.internals.InternalsConfig;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.test.util.LogfileTestTailer;
Expand Down
Expand Up @@ -32,6 +32,7 @@
import ch.qos.logback.core.joran.spi.JoranException;
import ch.qos.logback.core.util.StatusPrinter;

import com.evolveum.midpoint.schema.internals.InternalsConfig;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
Expand Down
Expand Up @@ -29,12 +29,12 @@
import org.apache.commons.lang.Validate;
import org.w3c.dom.Element;

import com.evolveum.midpoint.common.monitor.InternalMonitor;
import com.evolveum.midpoint.prism.Definition;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.PrismObjectDefinition;
import com.evolveum.midpoint.schema.ResourceShadowDiscriminator;
import com.evolveum.midpoint.schema.internals.InternalMonitor;
import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition;
import com.evolveum.midpoint.schema.processor.ResourceSchema;
import com.evolveum.midpoint.schema.util.MiscSchemaUtil;
Expand Down
Expand Up @@ -23,6 +23,7 @@
import com.evolveum.midpoint.prism.polystring.PrismDefaultPolyStringNormalizer;
import com.evolveum.midpoint.prism.schema.SchemaDefinitionFactory;
import com.evolveum.midpoint.prism.schema.SchemaRegistry;
import com.evolveum.midpoint.prism.util.PrismMonitor;
import com.evolveum.midpoint.prism.xnode.RootXNode;
import com.evolveum.midpoint.prism.xnode.XNode;
import com.evolveum.midpoint.util.DebugUtil;
Expand Down Expand Up @@ -64,6 +65,8 @@ public class PrismContext {
private SchemaDefinitionFactory definitionFactory;
private PolyStringNormalizer defaultPolyStringNormalizer;
private Map<String, Parser> parserMap;
private PrismMonitor monitor = null;

@Autowired
private Protector defaultProtector;

Expand Down Expand Up @@ -187,10 +190,18 @@ public Protector getDefaultProtector() {
public void setDefaultProtector(Protector defaultProtector) {
this.defaultProtector = defaultProtector;
}


public PrismMonitor getMonitor() {
return monitor;
}

public void setMonitor(PrismMonitor monitor) {
this.monitor = monitor;
}

//endregion

//region Parsing Prism objects
//region Parsing Prism objects
/**
* Parses a file and creates a prism from it. Autodetect language.
* @throws IOException
Expand Down
Expand Up @@ -208,8 +208,17 @@ public void addReplaceExisting(Item<?,?> item) throws SchemaException {

@Override
public PrismObject<O> clone() {
if (prismContext != null && prismContext.getMonitor() != null) {
prismContext.getMonitor().beforeObjectClone(this);
}

PrismObject<O> clone = new PrismObject<O>(getElementName(), getDefinition(), prismContext);
copyValues(clone);

if (prismContext != null && prismContext.getMonitor() != null) {
prismContext.getMonitor().afterObjectClone(this, clone);
}

return clone;
}

Expand Down
@@ -0,0 +1,35 @@
/**
* Copyright (c) 2016 Evolveum
*
* 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.evolveum.midpoint.prism.util;

import com.evolveum.midpoint.prism.Objectable;
import com.evolveum.midpoint.prism.PrismObject;

/**
* Interface to plug in a monitoring code to prism. Implementation of this
* interface are called when selected important (usually expensive) operations
* take place in prism. This can be used for gathering stats, making assertions
* in the test code, etc.
*
* @author semancik
*/
public interface PrismMonitor {

<O extends Objectable> void beforeObjectClone(PrismObject<O> orig);

<O extends Objectable> void afterObjectClone(PrismObject<O> orig, PrismObject<O> clone);

}
Expand Up @@ -23,6 +23,9 @@
import java.util.Arrays;

import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.schema.internals.InternalMonitor;
import com.evolveum.midpoint.schema.internals.InternalsConfig;

import org.xml.sax.SAXException;

import com.evolveum.midpoint.prism.PrismContext;
Expand Down Expand Up @@ -60,6 +63,11 @@ public PrismContext createPrismContext() throws SchemaException, FileNotFoundExc
SchemaRegistry schemaRegistry = createSchemaRegistry();
PrismContext context = PrismContext.create(schemaRegistry);
context.setDefinitionFactory(createDefinitionFactory());

if (InternalsConfig.isPrismMonitoring()) {
context.setMonitor(new InternalMonitor());
}

return context;
}

Expand Down
Expand Up @@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.evolveum.midpoint.common.monitor;
package com.evolveum.midpoint.schema.internals;

/**
* @author semancik
Expand Down
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2010-2013 Evolveum
* Copyright (c) 2010-2016 Evolveum
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand All @@ -13,8 +13,11 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.evolveum.midpoint.common.monitor;
package com.evolveum.midpoint.schema.internals;

import com.evolveum.midpoint.prism.Objectable;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.util.PrismMonitor;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;

Expand All @@ -26,9 +29,11 @@
* @author Radovan Semancik
*
*/
public class InternalMonitor {
public class InternalMonitor implements PrismMonitor {

private static final Trace LOGGER = TraceManager.getTrace(InternalMonitor.class);

private static final String CLONE_START_TIMESTAMP_KEY = InternalMonitor.class.getName()+".cloneStartTimestamp";

private static long resourceSchemaParseCount = 0;
private static long resourceSchemaFetchCount = 0;
Expand Down Expand Up @@ -56,6 +61,9 @@ public class InternalMonitor {
*/
private static long provisioningAllExtOperationCount = 0;

private static long prismObjectCloneCount = 0;
private static long prismObjectCloneDurationMillis = 0;

public static long getResourceSchemaParseCount() {
return resourceSchemaParseCount;
}
Expand Down Expand Up @@ -215,6 +223,33 @@ public static void recordShadowOtherOperation() {
provisioningAllExtOperationCount++;
}

@Override
public synchronized <O extends Objectable> void beforeObjectClone(PrismObject<O> orig) {
LOGGER.trace("MONITOR prism object clone start: {}", orig);
prismObjectCloneCount++;
orig.setUserData(CLONE_START_TIMESTAMP_KEY, System.currentTimeMillis());
}

@Override
public synchronized <O extends Objectable> void afterObjectClone(PrismObject<O> orig, PrismObject<O> clone) {
Object cloneStartObject = orig.getUserData(CLONE_START_TIMESTAMP_KEY);
if (cloneStartObject != null && cloneStartObject instanceof Long) {
long cloneDurationMillis = System.currentTimeMillis() - (Long)cloneStartObject;
prismObjectCloneDurationMillis += cloneDurationMillis;
LOGGER.debug("MONITOR prism object clone end: {} (duration {} ms)", orig, cloneDurationMillis);
} else {
LOGGER.debug("MONITOR prism object clone end: {}", orig);
}
}

public static long getPrismObjectCloneCount() {
return prismObjectCloneCount;
}

public static void setPrismObjectCloneCount(long prismObjectCloneCount) {
InternalMonitor.prismObjectCloneCount = prismObjectCloneCount;
}

public static void reset() {
LOGGER.info("MONITOR reset");
resourceSchemaParseCount = 0;
Expand Down Expand Up @@ -257,4 +292,5 @@ private static void traceOperation(String opName, long counter) {
LOGGER.trace("MONITOR {} ({}):\n{}", new Object[]{opName, counter, sb});
}
}

}
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2010-2013 Evolveum
* Copyright (c) 2010-2016 Evolveum
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand All @@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.evolveum.midpoint.common;
package com.evolveum.midpoint.schema.internals;

/**
* @author semancik
Expand All @@ -33,21 +33,34 @@ public class InternalsConfig {
// inside midpoint (e.g. change of SystemConfiguration object) will be ignored.
// DO NOT USE IN PRODUCTION CODE
public static boolean avoidLoggingChange = false;

private static boolean prismMonitoring = false;

public static boolean isPrismMonitoring() {
return prismMonitoring;
}

public static void setPrismMonitoring(boolean prismMonitoring) {
InternalsConfig.prismMonitoring = prismMonitoring;
}

public static void setDevelopmentMode() {
consistencyChecks = true;
encryptionChecks = true;
prismMonitoring = true;
}

public static void turnOffAllChecks() {
consistencyChecks = false;
encryptionChecks = false;
readEncryptionChecks = false;
prismMonitoring = false;
}

public static void turnOnAllChecks() {
consistencyChecks = true;
encryptionChecks = true;
encryptionChecks = true;
prismMonitoring = true;
}
}
Expand Up @@ -30,12 +30,12 @@
import org.apache.commons.lang.Validate;
import org.w3c.dom.Element;

import com.evolveum.midpoint.common.InternalsConfig;
import com.evolveum.midpoint.prism.ItemDefinition;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.PrismValue;
import com.evolveum.midpoint.prism.delta.PrismValueDeltaSetTriple;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.schema.internals.InternalsConfig;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.util.ObjectResolver;
import com.evolveum.midpoint.util.MiscUtil;
Expand Down
Expand Up @@ -17,14 +17,14 @@

import javax.xml.namespace.QName;

import com.evolveum.midpoint.common.InternalsConfig;
import com.evolveum.midpoint.model.api.ModelService;
import com.evolveum.midpoint.model.common.expression.ExpressionEvaluationContext;
import com.evolveum.midpoint.prism.PrismContainerDefinition;
import com.evolveum.midpoint.prism.PrismContainerValue;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.crypto.Protector;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.schema.internals.InternalsConfig;
import com.evolveum.midpoint.schema.util.ObjectResolver;
import com.evolveum.midpoint.security.api.SecurityEnforcer;
import com.evolveum.midpoint.util.exception.SchemaException;
Expand Down
Expand Up @@ -17,7 +17,6 @@

import javax.xml.namespace.QName;

import com.evolveum.midpoint.common.InternalsConfig;
import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition;
import com.evolveum.midpoint.model.api.ModelService;
import com.evolveum.midpoint.model.common.expression.ExpressionEvaluationContext;
Expand All @@ -32,6 +31,7 @@
import com.evolveum.midpoint.prism.query.ObjectFilter;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.schema.constants.ExpressionConstants;
import com.evolveum.midpoint.schema.internals.InternalsConfig;
import com.evolveum.midpoint.schema.util.ObjectQueryUtil;
import com.evolveum.midpoint.schema.util.ObjectResolver;
import com.evolveum.midpoint.security.api.SecurityEnforcer;
Expand Down
Expand Up @@ -30,7 +30,6 @@
import javax.script.ScriptException;
import javax.xml.namespace.QName;

import com.evolveum.midpoint.common.monitor.InternalMonitor;
import com.evolveum.midpoint.model.common.expression.ExpressionSyntaxException;
import com.evolveum.midpoint.model.common.expression.ExpressionUtil;
import com.evolveum.midpoint.model.common.expression.ExpressionVariables;
Expand All @@ -51,6 +50,7 @@
import com.evolveum.midpoint.prism.polystring.PolyString;
import com.evolveum.midpoint.prism.xml.XsdTypeMapper;
import com.evolveum.midpoint.schema.constants.MidPointConstants;
import com.evolveum.midpoint.schema.internals.InternalMonitor;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.util.ObjectResolver;
import com.evolveum.midpoint.task.api.Task;
Expand Down

0 comments on commit 7d5b7be

Please sign in to comment.