diff --git a/README.md b/README.md index 0a8eb68..f98c07e 100644 --- a/README.md +++ b/README.md @@ -25,9 +25,9 @@ ## Iago Quick Start -NOTE: This repo has only recently been made public and our velocity is high at the moment, with significant work being done on documentation in particular. Please join iago-users@googlegroups.com (https://groups.google.com/d/forum/iago-users) for updates and to ask pressing questions. +NOTE: This repo has only recently been made public and our velocity is high at the moment. Please join [iago-users@googlegroups.com](https://groups.google.com/d/forum/iago-users) for updates and to ask questions. -If you are already familiar with the Iago Load Generation tool, follow these steps to get started; otherwise, start with the Iago Overview. For questions, please contact iago-users@googlegroups.com. +If you are already familiar with the Iago Load Generation tool, follow these steps to get started; otherwise, start with the Iago Overview and perhaps Iago Philosophy, also known as "Why Iago?". For questions, please contact [iago-users@googlegroups.com](https://groups.google.com/d/forum/iago-users). @@ -36,7 +36,7 @@ If you are already familiar with the Iago Load Generation tool, follow these ste 1. Download and unpack the Iago distribution. We support Scala 2.9 and recommend you clone the latest master: master. -2. Read the documentation. We'll be adding more recommended steps here shortly. +2. Read the documentation. @@ -50,7 +50,18 @@ We support Scala 2.9 and recommend you clone the latest master: +% mvn package -DskipTests +% mkdir tmp; cd tmp +% unzip ../target/iago-version-package-dist.zip +% java -jar iago-version.jar -f config/my_config.scala + +Don't assume that you can skip the package/unzip steps if you're just changing a config file. You need to re-package and unzip again. If you are using Iago as a library, for example, in the case of testing over the Thrift protocol or building more complex tests with HTTP or Memcached/Kestrel, you should instead add a task to your project's configuration. See Configuring Your Test for more information. @@ -92,6 +103,8 @@ For replay, Iago recommends you scrub your logs to only include requests which m * **Idempotent**, meaning that re-execution of a transaction any number of times yields the same result as the initial execution. * **Commutative**, meaning that transaction order is not important. Although transactions are initiated in replay order, Iago's internal behavior may change the actual execution order to guarantee the transaction rate. Also, transactions that implement `Future` responses are executed asynchronously. You can achieve ordering, if required, by using Iago as a library and initiating new requests in response to previous ones. Examples of this are available. +Unless you change your configuration's reuseFile parameter, make sure that your sample log has at least 1000 items. + [Top](#Top) @@ -363,7 +376,7 @@ You can specify any of the following parameters: log -

A string value that specifies the complete path to the log you want Iago to replay. The log should be on your local file system.

+

A string value that specifies the complete path to the log you want Iago to replay. The log should be on your local file system. The log should have at least 1000 items or you should change the reuseFile parameter.

Example: log = "logs/yesterday.log"

Required @@ -441,17 +454,24 @@ You can specify any of the following parameters: loggers

A List of LoggerFactories; allows you to define the type and level of logging you want

-

Example: loggers = new LoggerFactory( - level = Level.DEBUG - handlers = ConsoleHandler - ) = "preflight"

+

Example:

+
import com.twitter.logging.LoggerFactory
+import com.twitter.logging.config._
+
+new ParrotLauncherConfig {
+  ...
+  loggers = new LoggerFactory(
+    level = Level.DEBUG,
+    handlers = new ConsoleHandlerConfig()
+  )
+} 
Nil numFeederInstances

Will bring up the specified number of feeder instances

Example: numFeederInstances = 2

- 1 + 1 numInstances @@ -539,7 +559,9 @@ You can specify any of the following parameters: createDistribution

You can use this field to create your own distribution rate, instead of having a constant flow. You will need to create a subclass of RequestDistribution and import it.

-

Example: createDistribution = "createDistribution = { rate => new MyDistribution(rate) }"

+

Example:

createDistribution = """createDistribution = {
+    rate => new MyDistribution(rate)
+}"""

""