Fault diagnosis, testing and tolerance in large scale computer and communication systems is a topic of great interest to the computer and communications research communities. In this paper, we give a broad survey of an area called system level diagnosis initiated by Preparata, Metze and Chien. Our survey includes different models of diagnosis and related diagnosis and diagnosability algorithms. In particular, we have given a detailed view of distributed diagnosis. We believe most of these works form the foundation of the research in the emerging area of fault tolerance in a mobile environment.