public void addRequestForSystemError(String requestName, long duration, int cpuTime,
			int allocatedKBytes, String stackTrace) {
		// comme la méthode addRequest, cette méthode n'est pas synchronisée pour ne pas avoir
		// de synchronisation globale à l'application sur cette instance d'objet
		// ce qui pourrait faire une contention et des ralentissements,
		// par contre on synchronise request et errors
		assert requestName != null;
		assert duration >= -1; // -1 pour le counter de log
		assert cpuTime >= -1;
		// on ne doit conserver les stackTraces que pour les compteurs d'erreurs et de logs plus limités en taille
		// car sinon cela risquerait de donner des compteurs trop gros en mémoire et sur disque
		assert errorCounter;
		// le code ci-après suppose qu'il n'y a pas de contexte courant pour les erreurs systèmes
		// contrairement à la méthode addRequest
		assert contextThreadLocal.get() == null;
		final String aggregateRequestName = getAggregateRequestName(requestName);
		final CounterRequest request = getCounterRequestInternal(aggregateRequestName);
		synchronized (request) {
			request.addHit(duration, cpuTime, allocatedKBytes, true, stackTrace, -1);
		}
		synchronized (errors) {
			errors.addLast(new CounterError(requestName, stackTrace));
			if (errors.size() > MAX_ERRORS_COUNT) {
				errors.removeFirst();
			}
		}
	}
@Test
	public void testAddRequestForSystemError() {
		final CounterRequest request = createCounterRequest();
		final Counter errorCounter = new Counter(Counter.ERROR_COUNTER_NAME, null);
		errorCounter.setMaxRequestsCount(200);
		errorCounter.addRequestForSystemError(request.getName(), request.getMean(), 0, 0, null);
		final List<CounterRequest> before = errorCounter.getOrderedRequests();
		errorCounter.addRequestForSystemError(request.getName(), request.getMean(), 0, 0,
				"stacktrace");
		final List<CounterRequest> after = errorCounter.getOrderedRequests();
		after.get(0).removeHits(request);
		// on teste le contenu des CounterRequest par le contenu de toString
		assertEquals("error requests", before.toString(), after.toString());
		int i = 0;
		while (errorCounter.getRequestsCount() < Counter.MAX_ERRORS_COUNT) {
			errorCounter.addRequestForSystemError("request a" + i, 1, 0, 0, null);
			i++;
		}
		errorCounter.addRequestForSystemError("request a" + i, 1, 0, 0, null);
		errorCounter.clear();
		i = 0;
		while (errorCounter.getRequestsCount() < Counter.MAX_ERRORS_COUNT) {
			errorCounter.bindContextIncludingCpu("request b" + i);
			errorCounter.addRequestForCurrentContext("stack trace");
			i++;
		}
		errorCounter.bindContextIncludingCpu("request b" + i);
		errorCounter.addRequestForCurrentContext("stack trace");

		// addRequestForCurrentContext mais sans contexte courant
		errorCounter.addRequestForCurrentContext("stack trace");
		errorCounter.addRequestForCurrentContext(true);
	}